0

2日以上経過した空のファイルをすべて削除しようとしています。また、ドットで始まる隠しファイルを無視しています。私はこのコードでそれをやっています:

find /u01/ -type f -size 0 -print -mtime +2 | grep -v "/\\." | xargs rm

ファイル名にスペースが入るまでは問題なく動作します。コードにそれらを無視させるにはどうすればよいですか?

OSはSolarisです。

4

1 に答える 1

1

オプション1

findGNUとGNUxargsを適切な場所(ではなく/usr/bin)にインストールし、以下を使用します。

find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -print0 | xargs -0 rm

-print(私があなたのオプションから(私が思うに)迷子を削除したことに注意してくださいfind。表示されたオプションは、名前がで始まらない2日以上前に変更された空のファイルを削除します。.これはあなたのオリジナルgrepが扱っているように見える条件です。 )。

オプション2

問題は主にxargs、入力をスペースで分割するように定義されていることです。別の方法は、名前にスペースを入れて適切に動作する独自のxargsサロゲートを作成することです。私はそれをしました。次に、ファイル名に改行が含まれている場合にのみ問題が発生します—ファイルシステムで許可されています。NUL('\0')ターミネータの使用は安全であることが保証されています。パス名に表示できない唯一の文字です(これが、GNUがパス名-print0などで使用することを選択した理由です)。

オプション3

最後のより良いオプションはおそらく:

find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -exec rm {} \;

これにより、使用がまったく回避xargsされ、すべてのファイル名(パス名)が正しく処理されます。ただし、rm見つかったファイルごとに1回実行する必要があります。実行ごとに数個のファイルを処理するだけであれば、それほど苦痛ではありません。

POSIX 2008では、の+代わりに表記法が導入され、コマンドを実行する前にコマンドラインに割り当てるスペースに収まるだけの数の引数を収集して、の\;ように動作します。xargs

find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -exec rm {} +

私が取り組んだバージョンのSolarisはその表記をサポートしていませんが、旧バージョンのSolarisで作業していることは知っています。GNUはマーカーをfindサポートしているため、および回避策は不要になります。+-print0xargs -0

于 2012-10-17T07:19:40.320 に答える