
我有一堆資料夾,我想循環所有這些資料夾,並在每個資料夾中建立另一個名為“照片”的資料夾
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
在每個目錄中建立目錄。
旗幟-p
的mkdir
涵義:
-p, --parents
no error if existing, make parent directories as needed
在這裡,我只是用它來抑制目標目錄已存在時的錯誤訊息。如果您想查看錯誤,請將其刪除。
Photo
請注意,這將無法在包含以下內容的目標目錄中建立子目錄:文件名為照片。不過,您尚未指定在這些情況下應該做什麼,並且到目前為止發布的所有其他答案也有此限制。