私は現在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
制限されます。これにより、無駄なエラーメッセージが生成されます。ディレクトリを削除するには、またはを繰り返す必要があります。この場合は、実行したくない作業です。find
rm
rm
rmdir
-exec
削除するファイルが多い場合は、コマンド仕様の最後のセミコロンをプラス記号に置き換えることでパフォーマンスが向上します。rm
各ファイルに対して 1 つのコマンドを生成する代わりに、できるだけ少ないコマンドを生成して、できるだけ多くのパス名引数を入力します。可能な限りrm
コマンドラインの長さが許可する限り、すべてのコマンドに追加します。これにより、新しいプロセスの必要性が大幅に削減されますfork()
。
答え2
あなたの質問はwithではなくrm
withですfind
。-maxdepth 0
検索を開始ディレクトリに制限するには、このオプションを使用します。
-maxdepth
あなたのバージョンがそれをサポートしていない場合は、ディレクトリをfind
使用して除外することもできます。-path
-prune
ディレクトリツリー全体を無視するには、ツリー内のすべてのファイルを確認する代わりに-pruneを使用します。たとえば、src / emacsディレクトリとその下のすべてのファイルとディレクトリをスキップして、見つかった他のファイルの名前を印刷するには、次の手順を実行します。
探す。 -パス ./src/emacs -prune -o -print