Shell-Script

如何為子目錄遞歸執行 ZSH glob 命令

  • February 14, 2021

我有一個 ZSH glob 命令,可以刪除文件夾中除最新的 10 個目錄之外的任何內容。

#! /bin/zsh
cd /path/to/backups/pod1 && rm -rf ./*(Om[1,-11])

但是,這僅限於 pod1 目錄。我在同一級別有許多備份目錄,即 pod1、pod2、pod3 等…理想情況下,我希望有一個這樣的萬用字元:

cd /path/to/backups/* && rm -rf ./*(Om[1,-11])

…這將按照上述在備份的任何子目錄中執行 glob 命令。

但是,當我執行它時,我收到以下消息:

cd: too many arguments

所以我不太確定如何做到這一點。

cd只接受一個論點。一種方法是進入每個目錄(儘管沒有必要,如果目錄都是完全限定的(也就是說,目錄不是相對的),則cd使用子 shell )

for d in /path/to/backups/*; do
 ( cd $d && rm -rf ./*(om[1,-11]) )
done

另一種方法是直接刪除文件(此處print先進行調試以確認已匹配正確的文件),因為可以在表達式中指定多個 glob。請注意,這總共保留 10 個文件,而基於循環的解決方案在每個目錄中保留 10 個文件。

print -l /path/to/backups/pod*/*(Om[1,-11])

但是,如果匹配的文件太多,這可能會遇到 shell 限制,在這種情況下,或者可能需要xargsZSH 。zargs

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