8

私は今日(bashで約8年間幸せにハッキングした後)、「rm」を使用して「日付で削除」する簡単な方法がないことに気づきました。したがって、解決策は、rm、ls、find、awk、sedなどのコマンドの組み合わせをパイプ処理することです。

たとえば、2009年から作業ディレクトリ内のすべてのファイルを削除したいとします。一般的なアプローチは何でしょうか。

私は次のことを思いつきました。これはお尻が醜く、「rm」がディレクトリをスキップするように設定されている場合にのみ実行する必要があります(そうでない場合は親ディレクトリを削除します)。

ls -la | awk '{if (substr($6,0,5)==2009) print $8}' | xargs rm

最もエレガントで最も法外に過剰に設計されたソリューションの両方のポイント。

4

5 に答える 5

11

findとrmを組み合わせます(パイプなし)

find .  ...bunch of find criterias to select certain files (e.g. by date) .... -exec rm \{\} \;

編集:あなたの例のパラメータを使用すると、

find . -maxdepth 1 -type f -ctime -12 -exec rm \{\} \;

警告:これは今日だけ機能します:-)。(毎回動作させるには、-ctimeをabsoulte timeに置き換えます。マンページのtimeXYを参照してください)。

于 2009-01-12T09:06:55.817 に答える
10

find の一部のバージョンは -delete オプションをサポートしているため、さらに効率的です...

find . -maxdepth 1 -type f -ctime -12 -delete;

find manページを確認してください(これはUbuntuの最新リリースで機能しました)

于 2009-01-12T09:32:39.883 に答える
3

私は使うだろう:

find . -maxdepth 1 -type f -newerct 'jan 1' -print0 \
    | xargs -0 rm

(または-newermt変更時間でフィルタリングしたい場合)

-newerXY の 't' 形式は、cvs ( docoを参照) と互換性のある任意の日付形式を許可すると言われていることに注意してください。

于 2009-01-12T09:33:02.643 に答える
1

find(1)ls(1)出力を解析するよりも、必要なことを行う方がはるかに効率的です。

編集:注意すべきことは、ファイル名にスペースが含まれているため、パフォーマンスを向上させるために (で使用する)findをサポートする必要があります。-print0xargs -0

find . -mtime +12 -print0 | xargs -0 rm -f
于 2009-01-12T09:17:20.117 に答える
1

簡単に壊れてしまう可能性のある ls(1) を解析する代わりに、stat(1) に頼るべきです:

stat -c '%z/%n' files_or_glob | grep '^date' | cut -d/ -f2- | xargs -d '\n' rm -i

例えば

$ stat -c '%z/%n' *| grep '^2008-12-16' | cut -d/ -f2- | xargs -d '\n' rm -i

注: これは、改行が埋め込まれたファイル名を正しく処理しません。ただし、野生ではめったに見つかりません。

于 2009-01-12T09:32:08.027 に答える