[英]Copy badly-named files from one deeply-nested dir, content-address rename them, to another flattened sub-directory, in a Bash one-liner?
如何將分布在深度嵌套子目錄中的文件復制到另一個根本沒有嵌套的子目錄(即平面)? 為了提高難度級別,我有這些限制/皺紋。
我嘗試過cp
、 find
、 xargs
、 parallel
、 uuidgen
、 md5sum
、 Bash for
循環及其各種組合,但效果有限。 我能做到的最好的事情是為每個文件生成一個隨機的UUID。 沒關系,我想,但這並不完全是我想要的“內容尋址”,因為我想根據文件的內容對文件進行重復數據刪除。
作為參考,它看起來像這樣,其中source
和dest
是源和目標子目錄。
find source/* -type f -exec sh -c 'for f; do cp "$f" 'dest'/"$(uuidgen)"; done' Renamer {} +
盡管 UUID 很好,但我並沒有對它們抱有熱情,並且對其他想法持開放態度,以上述約束為模。
謝謝!
使用命令md5sum
計算文件內容的md5sum
:
find * -type f -exec sh -c 'for f; do cp "$f" 'dest'/$(md5sum "$f" | sed -e s/[[:space:]].*//); done' _ {} +
這使用sed
來通知md5sum
的輸出不包含文件名而不是通常的md5sum <file> | awk' {print $1}'
md5sum <file> | awk' {print $1}'
這樣我就不必考慮轉義引號。
當然,您可能會與 md5 發生哈希沖突,但是您可以輕松地將哈希切換為使用sha256sum
或任何您喜歡的方法。
如果使用 GNU Parallel,元音的解決方案會短一些:
find * -type f -print0 | parallel -0 cp {} dest/'$(md5sum {} | sed -e s/[[:space:]].*//)'
對包含多個連續空格和換行符的文件名進行了測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.