
繼這兩篇貼文之後:
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//\//-}"'