我有一个 .csv
文件,它看起来像这样:
unnamed_0711-42_p1.mov,day1_0711-42_p1.mov
unnamed_0711-51_p2.mov,day1_0711-51_p2.mov
unnamed_0716-42_p1_2.mov,day1_0716-42_p1_2.mov
unnamed_0716-51_p2_2.mov,day1_0716-51_p2_2.mov
我编写了这段代码,将文件从字段 1 中的名称(例如 unnamed_0711-42_p1.mov
)重命名为字段 2 中的名称(例如 day1_0711-42_p1.mov
)。
csv=/location/rename.csv
cat $csv | while IFS=, read -r -a arr; do mv "${arr[@]}"; done
但是,这个脚本只有在它和所有需要重命名的文件都在同一个目录中时才有效。以前没问题,但现在我需要在各个子目录中查找文件(无需将完整路径添加到我的 .csv
文件)。
我如何修改我的脚本以便搜索子目录中的文件然后像以前一样更改名称?
最佳答案
尽管会导致脚本效率低下,但实现此目的的一种简单方法是:
for D in `find . -type d`
do
cat $csv | while IFS=, read -r -a arr; do mv "${arr[@]}"; done
done
这将对当前目录中的每个目录运行您的命令,但这会遍历每个子目录的整个文件名列表。另一种方法是在处理文件名称时搜索每个文件:
csv=files.csv
while IFS=, read -ra arr; do
while IFS= read -r -d '' old_file; do
old_dir=$(dirname "$old_file")
mv "$old_file" "$old_dir/${arr[1]}"
done < <(find . -name "${arr[0]}" -print0)
done<"$csv"
这使用 find
找到每个旧文件名,然后使用 dirname
获取旧文件的目录(我们需要它以便 mv
不会将重命名的文件放入不同的目录)。
这将重命名每个文件的每个实例(即,如果 unnamed_0711-42_p1.mov
出现在多个子目录中,每个实例将被重命名为 day1_0711-42_p1.mov
).如果您知道每个文件名只会出现一次,您可以通过将 -print -quit
添加到 find 命令的末尾,在管道之前来加快速度。
关于arrays - 调整文件重命名脚本,以便它搜索子目录中的每个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38589439/