重命名子目录中的所有文件,同时保持相同的位置

时间:2017-01-12 06:00:59

标签: bash

在我的父文件夹中,我有一个脚本和许多文件夹。这些文件夹中包含任意命名的文本文件。当我运行我的脚本重命名为文件时,新重命名的文件最终在父文件夹中。如何编写脚本以便新命名的文件保留在原始文件夹中?

for file in $(find . -type f -name '*txt') ; do
    name=$(parse text for correct name)
    mv "$file" "${name}.txt"
done

2 个答案:

答案 0 :(得分:3)

您面临的最大挑战是将path与原始filename分开,以便将原始文件移至path/name.txt。您可以使用参数扩展/子字符串删除来完成任务,例如(line是原始文件名读取)

while read -r line; do
    name=$(parse text for correct name)  # parse your new name as needed
    fname="${line##*/}"                  # isolate the filename in line
    dname="${line%"$fname"}"             # remove fname from end of line for path
    mv "$line" "${dname}/${name}.txt"
done < <(find . -type f -name '*txt')

答案 1 :(得分:1)

您未在mv命令中指定目录的问题。由于您的脚本是从父目录调用的,因此重命名的文件将在那里结束。

以这种方式修改:

for file in $(find . -type f -name '*txt'); do
    # grab the directory of the file being renamed
    dir=$(dirname "$file")
    name=$(parse text for correct name)
    mv "$file" "$dir/${name}.txt"
done

根据建议,您可以这样重写循环。如果有的话,这可以保护您免受文件名中的空格和小数的影响:

while read -r file; do
    dir=$(dirname "$file")
    name=$(parse text for correct name)
    mv "$file" "$dir/${name}.txt"
done < <(find . -type f -name '*txt')