2日以上経過した空のファイルをすべて削除しようとしています。また、ドットで始まる隠しファイルを無視しています。私はこのコードでそれをやっています:
find /u01/ -type f -size 0 -print -mtime +2 | grep -v "/\\." | xargs rm
ファイル名にスペースが入るまでは問題なく動作します。コードにそれらを無視させるにはどうすればよいですか?
OSはSolarisです。
find
GNUとGNUxargs
を適切な場所(ではなく/usr/bin
)にインストールし、以下を使用します。
find /u01/ -type f -size 0 -mtime +2 -name '[!.]*' -print0 | xargs -0 rm
-print
(私があなたのオプションから(私が思うに)迷子を削除したことに注意してくださいfind
。表示されたオプションは、名前がで始まらない2日以上前に変更された空のファイルを削除します。.
これはあなたのオリジナルgrep
が扱っているように見える条件です。 )。
問題は主にxargs
、入力をスペースで分割するように定義されていることです。別の方法は、名前にスペースを入れて適切に動作する独自のxargs
サロゲートを作成することです。私はそれをしました。次に、ファイル名に改行が含まれている場合にのみ問題が発生します—ファイルシステムで許可されています。NUL('\0'
)ターミネータの使用は安全であることが保証されています。パス名に表示できない唯一の文字です(これが、GNUがパス名-print0
などで使用することを選択した理由です)。
最後のより良いオプションはおそらく:
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
サポートしているため、および回避策は不要になります。+
-print0
xargs -0