在我的父文件夹中,我有一个脚本和许多文件夹。这些文件夹中包含任意命名的文本文件。当我运行我的脚本重命名为文件时,新重命名的文件最终在父文件夹中。如何编写脚本以便新命名的文件保留在原始文件夹中?
for file in $(find . -type f -name '*txt') ; do
name=$(parse text for correct name)
mv "$file" "${name}.txt"
done
答案 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')