將子目錄和子子目錄中的所有檔案複製到主目錄,並透過新增所有父目錄的前綴來修改檔案名

將子目錄和子子目錄中的所有檔案複製到主目錄,並透過新增所有父目錄的前綴來修改檔案名

繼這兩篇貼文之後:

https://askubuntu.com/questions/871898/move-files-to-parent-directory-prefixing-file-name-with-former-subdirectory-nam

https://askubuntu.com/questions/870844/recursively-add-directory-name-to-file-name

我想做同樣的事情,但複製而不是移動。簡單地說,我有一個包含子目錄和子子目錄的目錄,裡面有一些檔案。我想將所有檔案複製到另一個目標資料夾,但由於某些檔案具有確切的名稱,因此我想將父目錄的名稱作為前綴附加到檔案名稱。

我在 ubuntu 16.04 上運行

答案1

嘗試:

find  -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;

(如果命令看起來不錯,請刪除“echo”)

.
└── 1
    └── 2
        ├── 3
        │   └── 4
        │       └── foo.dat
        └── foo.dat

產量:

cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat

基本上,您會執行一個臨時小腳本(在每個符合的檔案上,該腳本透過將來源路徑中的cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"所有內容替換為 來產生目標名稱。該字串可以是任何內容,它只是用作腳本名稱的名稱如果出現錯誤。/-tinyscript

答案2

考慮到簡單性而不是效能,這並不是特別有效(由於為每個檔案啟動一個 bash 進程)。如果您有大量文件和/或時間是一個因素,則可能需要更複雜的解決方案。

find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'

相關內容