簡體   English   中英

將名稱錯誤的文件從一個深層嵌套的目錄、內容地址重命名,復制到 Bash one-liner 中的另一個扁平子目錄?

[英]Copy badly-named files from one deeply-nested dir, content-address rename them, to another flattened sub-directory, in a Bash one-liner?

如何將分布在深度嵌套子目錄中的文件復制到另一個根本沒有嵌套的子目錄(即平面)? 為了提高難度級別,我有這些限制/皺紋。

  1. 盡管源文件具有相同的擴展名 (*.xlsx),但它們的文件名中有空格。
  2. 源子目錄及其所有內容都是只讀的。
  3. 由於潛在的名稱沖突,由於糟糕的文件名,因為我有一堆這些文件,而它們的原始名稱對我來說毫無用處,我想以某種方式對它們進行內容尋址。
  4. 腳本環境是 Bash。
  5. 由於其他限制,在一行中執行此操作很重要。
  6. 為簡單起見加分,因為它越深奧,我的同事就越不可能理解這一點。

我嘗試過cpfindxargsparalleluuidgenmd5sum 、 Bash for循環及其各種組合,但效果有限。 我能做到的最好的事情是為每個文件生成一個隨機的UUID。 沒關系,我想,但這並不完全是我想要的“內容尋址”,因為我想根據文件的內容對文件進行重復數據刪除。

作為參考,它看起來像這樣,其中sourcedest是源和目標子目錄。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM