递归剪切子文件夹中的文件后缀

时间:2015-12-16 21:26:58

标签: bash mv

我有很多包含文件的目录:

  

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

请指教。 谢谢。

1 个答案:

答案 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_}的变量替换很快