我有很多包含文件的目录:
large_fffd612bdc3fab_main
我想从递归的目录中的所有文件中剪切后缀large_
并获取名称fffd612bdc3fab_main
我使用此命令,它适用于目录
中的文件for f in `find . -depth -type f -name large_*`; do mv $f $(echo $f | cut -c1-); done;
但是当我尝试使用子文件夹时,我得到了这样的错误:
mv: './fff97489a19e89_main/large_fff97489a19e89_main' and './fff97489a19e89_main/large_fff97489a19e89_main' are the same file
请指教。 谢谢。
答案 0 :(得分:2)
您可以使用-exec
和子shell执行此操作:
find . -name large_\* -exec \
sh -c 'f=$(basename "$1"); d=$(dirname "$1"); echo mv "$1" "$d/${f#large_}"' _ {} \;
那里的echo
仅用于测试。
确认输出看起来像您期望的那样
您可以删除echo
并重新运行,
或者只是将其传递给另一个sh
(除非文件名包含特殊字符,在这种情况下,管道到sh
不起作用,但删除echo
将会。)
这比你尝试编写的for-loop要好几个原因:
find
输出上的for循环一般不安全,也是一个坏习惯echo ... | cut
浪费,慢。 ${name#large_}
的变量替换很快