我一直在嘗試在“example”的所有子目錄中創建目錄“a”。
我嘗試的是以下內容:
mkdir example/*/a
但它不把'*'作為通配符,回傳mkdir: can not create ?example/*/a? directory: 它不存在檔案或目錄
請注意,示例中的子目錄太多,因此無法通過創建串列來實作。
我不想用 for 回圈來做這件事,因為我正在學習 bash 并且我不允許使用回圈。可能沒有辦法避免 for 回圈,在這種情況下,請告訴我:)。
謝謝你。
uj5u.com熱心網友回復:
嘗試:
dirs=( example/*/ )
mkdir -v "${dirs[@]/%/a}"
dirs=( example/*/ )example創建一個包含( )的所有子目錄的陣列(example/dir1/ example/dir2/ ...)。"${dirs[@]/%/a}"展開為一個串列,其中包含 的所有元素,dirs每個元素都a附加一個 ((example/dir1/a example/dir2/a ...))。
如果您有大量子目錄mkdir,則上述代碼中的子目錄可能會失敗,并出現“引數串列太長”錯誤。請參閱rm、cp、mv 命令的引數串列太長錯誤。
避免該問題的一種方法是將要創建的目錄的以 NUL 結尾的串列傳遞給xargs -0:
dirs=( example/*/ )
printf '%s\0' "${dirs[@]/%/a}" | xargs -0 mkdir -v
如有必要,這將運行多個mkdir命令,每個命令都有一個不超過限制的引數串列。
但是,如果目錄的數量很大,您可能會遇到性能問題,因為 Bash(不必要但不可避免地)對由 生成的串列進行排序example/*/。在這種情況下,最好使用find. 一種方法是:
find example -maxdepth 1 -mindepth 1 -type d -printf '%p/a\0' | xargs -0 mkdir -v
findxargs具有對-like 行為的內置支持-exec ... 。但是,在這種情況下使用它有點繁瑣。我能盡快想出的最好辦法是:
find example -maxdepth 1 -mindepth 1 -type d \
-exec bash -c 'mkdir -v "${@/%//a}"' bash {}
由于它在運行之前添加/a到傳遞給bash的所有引數,因此無論如何它可能會遇到“引數串列太長”錯誤。我將把它留在這里,因為它說明了一種有時有用的技術,但我建議不要使用它。findmkdir
uj5u.com熱心網友回復:
可能沒有辦法避免 for 回圈
您可以使用find:
find example -type d -not -name a -exec mkdir -p {}/a \;
uj5u.com熱心網友回復:
只是:
for i in example/*/; do
mkdir "$i"/a
done
uj5u.com熱心網友回復:
如果您已經知道 下的子目錄,我認為您只能避免回圈example,例如:
mkdir example/{subdir1,subdir2,subdir3}/a
否則,使用 for 回圈來拯救:
for d in example/*/; do mkdir "${d}a"; done
注意:如果您希望它向您顯示創建的目錄,請添加一個-vto 。mkdir
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/434999.html
上一篇:For回圈不是每行讀取它
