2015-12-16 56 views
2

我有很多的目錄與文件進去:子文件夾中遞歸切割文件後綴

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 

請指教。 謝謝。

回答

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循環更好:

  • 一個for循環超過find輸出不是一般的安全,和一個壞習慣
  • echo ... | cut是浪費,緩慢。變量替換${name#large_}很快
+0

提示:'sh -c'... {} ...''[不安全](https://github.com/koalaman/shellcheck/wiki/SC2156)一般來說也是。考慮重寫爲'sh -c'... $ 1 ...'_ {}' –

+0

非常棒的提示,重寫了它,謝謝! – janos

+0

非常感謝! – dezzinto