在目录中递归重命名某些文件 - Shell / Bash脚本

时间:2017-04-19 00:17:07

标签: bash shell directory rename

我到处搜索,想出下面这个脚本。我无法弄清楚这里的问题是什么。 我正在尝试遍历名为Extracted_Source的目录中的所有目录,以重命名任何带有附加时间戳的CSV文件。 任何帮助表示赞赏。

我一直在

No such file or directory./Extracted_Source/*

以下是来源:

for files in ./Extracted_Source/*
do if ["$files" contains ".csv"]
then mv "$files" "${files%}_$(date "+%Y.%m.%d-%H.%M.%S").csv";
fi done; echo end

2 个答案:

答案 0 :(得分:1)

我会使用find

find ./Extracted_Source -type f -name "*.csv" | while -r read files; do mv "$files" "${files%.*}_$(date "+%Y.%m.%d-%H.%M.%S").csv"; done

这还有一个额外的好处,就是处理文件名中包含空格的文件。

这是多线形式的相同内容:

find ./Extracted_Source -type f -name "*.csv" | \
while read -r files; do 
    mv "$files" "${files%.*}_$(date "+%Y.%m.%d-%H.%M.%S").csv"
done

您还可以使用流程替换来提供while循环:

while read -r files; do 
    mv "$files" "${files%.*}_$(date "+%Y.%m.%d-%H.%M.%S").csv"
done < <(find ./Extracted_Source -type f -name "*.csv")

在您当前的脚本中,${files%}没有做任何事情。该文件的.csv部分未被删除。正确的方法是${files%.*}

试着这样看看自己:for files in *; do echo "${files%.*}"; done

有关详细信息,请参阅Bash Hackers Wiki

答案 1 :(得分:0)

首先,错误消息表示您在./Extracted_Source/中没有任何文件或文件夹。但是,以下内容可行:

#!/bin/bash

for file in ./Extracted_Source/*/*.csv; do
    mv "$file" "${file/.csv}_$(date "+%Y.%m.%d-%H.%M.%S").csv";
done

echo end

这并不考虑已经移动过的csv文件。