特定のディレクトリではファイルの種類は削除されますが、サブディレクトリでは削除されません。

特定のディレクトリではファイルの種類は削除されますが、サブディレクトリでは削除されません。

私は現在HP-UXで作業しており、保存ポリシーに基づいて特定の日数を過ぎたファイルを削除するcronジョブを毎朝実行しています。最近、ファイルが削除されるパスにサブディレクトリを追加しましたが、そのサブディレクトリの下のファイルに別のポリシーを適用したいと思います。

現在私のコマンドは次のとおりです。

find /directory/backup -mtime +1 -name "FileName*.EXT" -exec rm {} \; 

このコマンドを実行すると、バックアップディレクトリの下のすべてのファイルと、バックアップサブディレクトリ内の一致するすべてのファイルが削除されます。私は、バックアップディレクトリ内にbackup_dbという別のディレクトリがあるということです。

pwd
/directory/backup/backup_db

サブディレクトリではなくバックアップディレクトリにのみ削除を制限したいと思います。どうすればいいですか?どんな助けでも大変感謝します。

頑張った男RMしかし、私に役立つものは何も見つかりませんでした。

答え1

コマンドラインを通じて、このfindコマンドは一連の個々のrmコマンドを生成して実行します。各rmコマンドは、フルパス名で指定されたファイルを削除します。だからrm制限する必要はありませんがfind

これを行うための構文は、歴史的な理由のために少し難しいかもしれません。次のことができます。

find /directory/backup ! -path /directory/backup -prune -mtime +1 -type f -name "FileName*.EXT" -exec rm {}\+

これは単一のディレクトリを制限するPOSIX準拠の方法ですfind $DIR ! -path $DIR -prune <desired_conditions> [desired_action]findただし、追加の条件を追加しない限り、その特定のディレクトリのサブディレクトリ名は引き続き一覧表示されます。

を使用すると、バックアップディレクトリ内のサブディレクトリのコマンドを生成する試みが-type f制限されます。これにより、無駄なエラーメッセージが生成されます。ディレクトリを削除するには、またはを繰り返す必要があります。この場合は、実行したくない作業です。findrmrmrmdir

-exec削除するファイルが多い場合は、コマンド仕様の最後のセミコロンをプラス記号に置き換えることでパフォーマンスが向上します。rm各ファイルに対して 1 つのコマンドを生成する代わりに、できるだけ少ないコマンドを生成して、できるだけ多くのパス名引数を入力します。可能な限りrmコマンドラインの長さが許可する限り、すべてのコマンドに追加します。これにより、新しいプロセスの必要性が大幅に削減されますfork()

答え2

あなたの質問はwithではなくrmwithですfind-maxdepth 0検索を開始ディレクトリに制限するには、このオプションを使用します。

-maxdepthあなたのバージョンがそれをサポートしていない場合は、ディレクトリをfind使用して除外することもできます。-path-prune

ディレクトリツリー全体を無視するには、ツリー内のすべてのファイルを確認する代わりに-pruneを使用します。たとえば、src / emacsディレクトリとその下のすべてのファイルとディレクトリをスキップして、見つかった他のファイルの名前を印刷するには、次の手順を実行します。

探す。 -パス ./src/emacs -prune -o -print

関連情報