files=`find C:/PATH/TO/DIRECTORY -name *.txt`
for file in $files; do
#need code to rename $file, by moving it into the same directory
例如。 $ file在C:/ PATH / TO / DIRECTORY / 2014-05-08中找到。 如何将$ file重命名为该目录而不是C:/ PATH / TO / DIRECTORY?
答案 0 :(得分:2)
您可以在查找中使用-execdir
选项:
find C:/PATH/TO/DIRECTORY -name '*.txt' -execdir mv '{}' '{}'-new \;
根据man find
:
-execdir utility [argument ...] ;
-execdir primary与-exec primary相同,但实用程序将被执行 从包含当前文件的目录。
答案 1 :(得分:0)
find C:/PATH/TO/DIRECTORY -name \*.txt | while read file
do
dir=$(dirname "$file")
base=$(basename "$file")
mv "$file" "$dir/new_file_name"
done
答案 2 :(得分:0)
使用此结构可以提供更好的服务:
while read fname
do
....
done < <(find ...)
或者,如果您没有使用bash
:
find ... | while read fname
do
....
done
将find
的输出存储在变量中,甚至执行for fname in $(find ...)
的问题是在空格上进行单词拆分。如果你有一个带有换行符的文件名,上面的结构仍然会失败,因为他们假设你每行有一个文件名,但它们比你现在的要好。
更好的解决方案是这样的:
find ... -print0 | xargs -0 -n1 -Ixxx somescript.sh "xxx"
但即使这样,如果文件名中包含引号或其他内容,也可能会出现问题。
底线是解析任意数据(文件名可以是)很难......