サブディレクトリでZSH globコマンドを再帰的に実行する方法

サブディレクトリでZSH globコマンドを再帰的に実行する方法

フォルダ内の最新の10個のディレクトリを除くすべてのディレクトリを削除するZSH globコマンドがあります。

#! /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

だから私は何をすべきかわかりません。

ベストアンサー1

cd1つのパラメータのみが許可されます。 1つの方法はcd各ディレクトリに移動することです(必須ではありませんが、サブシェルを使用する)。もしこれらのディレクトリは正規化されたディレクトリです(つまり、ディレクトリは相対的ではありません)。

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])

ただし、一致するファイルが多すぎると、シェルの制限に遭遇する可能性があり、その場合はxargsZSHが必要になることがあります。zargs

おすすめ記事