2017-05-15 14 views
1

我最近試圖通過一個目錄遞歸併將所有名爲file.jpg的文件複製到newfile.jpg與原始文件位於同一本地目錄中。如何使用bash在同一本地文件夾中創建文件的遞歸副本?

我找到了一個辦法,但有點麻煩,我有理由相信這可能不是最好的方法。我想在將它寫入腳本之前我會問。

這是我到目前爲止有:

cd top_of_source_dir 
#copy all file.jpg and append 'newfile.jpg' to the name 
find ./ -type f -name file.jpg -exec cp '{}' '{}newfile.jpg' \; 

#rename the newly created files to 'newfile.jpg' 
find ./ -type f -name 'file.jpgnewfile.jpg' -exec rename file.jpgn n '{}' \; 

有沒有人有一個配方做,在源目錄中的一個迭代?

+1

您可能希望'for f in * .jpg;確認echo「$ f」「new $ {f%。*}。jpg」;如果你確定輸出是正確的,將'echo'改爲'mv'。 – val0x00ff

+0

@ val0x00ff這不會通過源目錄執行遞歸,是嗎?我的文件可以在源目錄中有幾個級別。 –

+0

#雅克Gaudin,不,但它不是,但你可以做一些像'find ./ -type f -name'* .jpg'-exec bash -c'for f;做n =「new $ {f ## * /}」; echo「$ f」 - >「$ {f%/ *}/$ n」; done'_ {} +'如果你認爲結果是正確的,再次用'mv'代替'echo' – val0x00ff

回答

1

這裏有一個簡單的答案:

find -type f -name file.jpg -print -printf '%h/newfile.jpg\n' | xargs -n2 -d'\n' mv 

這使得find生成每個匹配的條目兩條線:舊的文件路徑和新的文件路徑(與%h與目錄路徑替換)。

xargs然後執行上每兩個連續行mv

  • -d'\n'指定該輸入流的元素是新行分開的,這是這裏的情況;
  • -n2指定xargs應該閱讀在一個時間兩個元素,並將它傳遞到該命令:如果兩個元素是foobar,然後xargs將運行mv foo bar,然後讀取下一對,並重復。

mv替換爲echo mv以查看它將實際執行哪些命令。

+0

謝謝我有'xargs'在我的腦海裏,但我不熟悉它。 –

+0

@JacquesGaudin嗯,你應該是因爲它非常強大:) – eush77

+0

好我會看看手冊。 –

相關問題