Bash
如何移動一些保持預定義目錄結構的特定文件夾?
我有一個包含大約 7k 個文件夾的目錄。這些文件夾是從 zip 中提取的,其中一些提取是使用 Python 腳本完成的。其中一些文件夾的提取方式是
Main Dir | --------------- | | fold1 fold2 | | ------ ------- | | | .pngs .txts fold2 | ------- | | .pngs .txts
要求是將
fold2
文件夾類別移動到類似於fold1
文件夾包含數據的目錄結構中,而不是另一個包含數據的同名文件夾。我如何使用 bash 或命令行來完成它,以便我將所有 7k 文件夾都放在一個類似的同構結構中
fold1
?
以下腳本將在目前工作目錄中搜尋表單的路徑
a/B/B/c
並將它們壓縮為a/B/c
. 這也壓縮a/B/B/B/B/c
toa/B/c
和a/B/B/c/D/D/e
toa/B/c/D/e
。您需要 GNU
find
使用支持的-regextype
選項和實現。如果您沒有這些,請查看腳本末尾的不安全 posix 版本。mv``-n
shopt -s dotglob failglob find . -depth -regextype egrep -type d -regex '.*/([^/]*)/\1' -print0 | while IFS= read -r -d '' path; do mv -n -t "$path/.." "$path"/* && rmdir "$path" done
支持任意路徑名(空格、特殊符號如
*
,甚至換行符)。該命令確保不覆蓋或刪除任何文件。在左樹的情況下,必須保留重複的子目錄。您將收到錯誤消息
rmdir: failed to remove './A/A'
。結果可以在右邊看到。. (before) . (after) └── A └── A ├── someFile ├── someFile ├── collision ├── collision └── A ├── anotherFile ├── collision └── A └── anotherFile └── collision
隱藏文件也被複製。
錯誤的 Posix 版本
一種更便攜的腳本版本,它不能處理路徑內的換行符,在上述情況下可能會覆蓋文件,並且不能移動隱藏文件(如果裡面有隱藏文件,則保留子目錄)。
find . -depth -type d | grep -E -x '.*/([^/]*)/\1' | while IFS= read -r path; do mv "$path"/* "$path/.." && rmdir "$path" done