何がしたいか
ファイル名、ディレクトリ名にある文字を含むファイルすべてを削除する必要がありました。ファイルがたくさんあるので手作業では無理だったのでシェルで削除しようと試みました。
条件
- ファイル名に"hoge"が含まれていないこと
- カレントディレクトリ以下のディレクトリ名に"hoge"が含まれていないこと
- ファイルのみが削除対象
- ファイル名に半角スペースが含まれている
試したこと
まずはfindとgrepを使って、"hoge"が含まれないファイルのフルパス一覧を取得します。
find * \! -type d | grep -v "hoge"
- ディレクトリ以外を指定
- grepで"hoge"を含まない行のみを選択
次に、xargsでrmコマンドを動かします。これで消したいファイルを一気に削除することができました。
find * \! -type d | grep -v "hoge" | xargs -d \\n rm
ファイル名に半角スペースが含まれるため、オプションなしでは1つのファイルを2つのファイルをして認識してしまいます。したがって、受け取る文字列の区切り文字を-dオプションで明示的に指定します。
ファイル名指定であれば以下でも条件を満たすことができると思いますが、今回は【カレントディレクトリ以下のディレクトリ名に"hoge"が含まれていないこと】が条件にあるので、grepを使いました。
find * \! -type d -name "*hoge*" print0 | xargs -0 rm
[2019/01/26 追記]
angel_p_57さんにコメントをいただき、内容を大きく修正しました。
元々は、ディレクトリもまとめてrmコマンドに突っ込んでいたため、エラー前提で実行していましたが、やはり余計なものは取り除いた方がスマートでした。
ありがとうございます。