ls grepとrmを使用してディレクトリ内のファイルを削除する

ls grepとrmを使用してディレクトリ内のファイルを削除する

私のプロジェクトルートには、この行を含むbashファイルがあります。

$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

上記の行は.txtプロジェクトルートからすべてのファイルを削除しますが、すべての.txtファイルを次のような別のフォルダにプッシュするとプロセスログ/同じコマンドを試しましたが、動作しませlsん。greprm

削除に失敗したファイルは次のとおりです。プロセスログ目次。

 $ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

気づく:ディレクトリからファイルを削除するなどの単純な正規表現パターンを使用してコマンドを試しましたが、 ls process_logs/ | grep -P '^*.txt$' | xargs rm -f機能しません。

答え1

find選択肢を試してみてください。再帰を望まない場合は、find深さオプションを使用できます。

find /process_logs -maxdepth 1 -mindepth 1 -type f -name 'some_shell_glob_pattern_here' -delete

ls解析された出力は、人間が読める印刷されたファイル名のバージョンが実際のファイル名と一致しない可能性があるため、必ずしもls正確ではないため推奨されません。ls詳細については、次を参照してください。lsを解析するウィキの記事。

答え2

私は同意するfindを使用する方が良い選択です。。しかし、あなたのコマンドが機能しない理由を追加したいと思います。

あなたの命令:

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

ls出力ファイル名道がない。しかし、パスを追加していませんrm。したがって、現在/ルートディレクトリのサブディレクトリからファイル名を削除しようとします。

努力する

$ cd process_logs/; ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

または

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs -i rm -f "process_logs/{}"

答え3

単純なシェルファイル名のグロービングパターンがある場合はそれを使用してください。

たとえば、(*より正確なパターンに置き換えることができます)

rm -f process_logs/*.txt

または、何十万ものファイルがある場合は、以下を使用してくださいxargs

printf '%s\0' process_logs/*.txt | xargs -0 rm -f

もし絶対に必要正規表現を使用するには、GNUは次のものをfind使用できます。

find process_logs -maxdepth 1 -type f -regex '\.txt$' -delete

述語は、末尾-regexのファイル名部分だけでなく、フルパス名と一致します(これがパス名の末尾にこの式を固定した理由です$)。-regextypeGNU マニュアルfindのオプションも参照してください。

関連情報