私のプロジェクトルートには、この行を含むbashファイルがあります。
$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f
上記の行は.txt
プロジェクトルートからすべてのファイルを削除しますが、すべての.txtファイルを次のような別のフォルダにプッシュするとプロセスログ/同じコマンドを試しましたが、動作しませls
ん。grep
rm
削除に失敗したファイルは次のとおりです。プロセスログ目次。
$ 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
のファイル名部分だけでなく、フルパス名と一致します(これがパス名の末尾にこの式を固定した理由です$
)。-regextype
GNU マニュアルfind
のオプションも参照してください。