在所有目錄中遞歸建立一個資料夾“Photo”

在所有目錄中遞歸建立一個資料夾“Photo”

我有一堆資料夾,我想循環所有這些資料夾,並在每個資料夾中建立另一個名為“照片”的資料夾

F1
--F11
----F111
----F112
--F12

我希望有:

F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo

答案1

您可以透過一次find呼叫來實現它。

find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;

該部分-name 'Photo' -prune -o告訴不要遞歸到現有(和新建立的)Photo目錄:如果找到的檔案(或目錄)的名稱為Photo,則停止處理它(-prune)。在另一種情況 ( -o) 中,繼續使用目錄 ( -type d) 並執行 ( -exec) 指令。

答案2

您可以將find結果傳遞給while而不是for因為這樣如果檔案名稱有空格它就不會中斷

首先 cd 到該目錄F1,然後執行:

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

如果該目錄存在,mkdir將拒絕創建它,所以沒有問題...

如果您的目錄名稱可能包含換行符號或其他奇怪的東西,請使用它可以處理任意名稱:

find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done

感謝@terdon 的幫助:)

答案3

從 F1 上方的目錄執行此腳本:

該腳本的目的是避免在照片目錄下創建多餘的照片目錄。

此外,它的設計是為了防止意外地從錯誤的位置(例如用戶的根目錄)運行它,而它不會看到該F1目錄並錯誤地在錯誤的宮殿中創建數百個照片目錄。

另外,我的目的是製作一個易於遵循的腳本,以便用戶可以對其進行自訂。

#!/bin/bash

while IFS= read -r -d '' i;
do
    if [[ ! -d $i/Photo ]]; then
        # Filter to skip folders named Photo
        thisfolder="$(echo $i | sed "s/.*\///")"
        if [[ ! $thisfolder == "Photo" ]]; then
            mkdir "$i/Photo"
        fi
    fi
done < <(find F1 -type d -print0)

腳本更新:

  • p將小寫改為photo大寫。
  • 新增了對非標準檔案名稱的支援(根據 Terdon 的建議)。

答案4

如果您使用的是 bash,則只需運行:

shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done

globstar選項**符合「所有檔案和0個或多個目錄和子目錄」。換句話說,它遞歸地匹配所有內容。因為/末尾的 ,**/將匹配所有目錄和子目錄(無文件)。因此,$d將迭代目前目錄及其子目錄中的所有目錄,並Photos在每個目錄中建立目錄。

旗幟-pmkdir涵義:

  -p, --parents
          no error if existing, make parent directories as needed

在這裡,我只是用它來抑制目標目錄已存在時的錯誤訊息。如果您想查看錯誤,請將其刪除。

Photo請注意,這將無法在包含以下內容的目標目錄中建立子目錄:文件名為照片。不過,您尚未指定在這些情況下應該做什麼,並且到目前為止發布的所有其他答案也有此限制。

相關內容