Bash

如何移動一些保持預定義目錄結構的特定文件夾?

  • May 11, 2019

我有一個包含大約 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/ctoa/B/ca/B/B/c/D/D/eto a/B/c/D/e

您需要 GNUfind使用支持的-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

引用自:https://unix.stackexchange.com/questions/518133