arrays - 调整文件重命名脚本,以便它搜索子目录中的每个文件

标签 arrays linux bash rename

我有一个 .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/

相关文章:

我们可以在一台 PC 上构建 linux 内核并将其安装在另一台 PC 上吗?

linux - 将 YouTrack 作为服务启动失败且没有错误消息

java - Fisher-Yates (java) 与 Collections.shuffle

java - 数组索引从最小到最大的排列

java - Swig,将c指针转换为float[]

python - 如何在 Python 中创建数组

regex - 如何使用 sed 和正则表达式替换(特殊)字符和数字的任意组合

bash - bash 中点的通配符是什么?

bash - 从 bash 脚本中将参数传递给 Octave 函数

bash - 如果文件末尾没有换行符,如何使用 `while read` (Bash) 读取文件的最后一行?