名前に文字列がないファイルを削除する


9

名前に文字列 '999'( ''なし)が含まれていないファイルを削除したい。

私が試してみました:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

しかし、どれも機能しません。私はmacOS Sierraとbash:3.2.57を使用しています。


2
grep -lファイル名ではなく、コンテンツで一致が見つかった(またはで見つからなかった-v)ファイルを一覧表示します。指定したファイルの内容と常に一致します。名前は一致しません。grep
JoL 2018年

回答:


18

で拡張グロビングパターンを使用するbash

rm ./!(*999*)

これはshopt -s extglob有効にする必要があります(また、安全のshopt -s failglobために、!(*999*)すべてのファイル名にが含まれている場合に、異常な名前のファイルが誤って削除されないようにします999)。パターン!(*999*)は、に一致する名前を除いて、現在のディレクトリ内の任意の名前に一致し*999*ます。隠しファイル(名前がドットで始まるファイル)も削除するには、このdotglobオプションを有効にします。

通常のファイルまたは通常のファイルへのシンボリックリンク(ディレクトリなどではない)のみを処理するには:

for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done

zsh上記ループシェル当量であろう

rm ./(^(*999*))(.)

最初のコマンドはgrepファイル内を調べるため、機能しません。行が含ま999れていないすべてのファイルが削除されます(--nullオプションを追加した場合に機能しますxargs -0)。

grepmacOSではサポートされていないため、2番目のコマンドは機能しません--null-data(ただし、--nullオプションはありますが、ファイル名の出力を生成する場合のみ)。また、ファイルの名前だけでなく999、ファイルのパス(ディレクトリコンポーネントを含む)のどこでも検索されることに注意してください。


1
このfailglobオプションを有効にすることもでき!(*999*)ます999。そうしないと、名前にを含まない他のファイルがない場合に呼び出されるファイルが削除される可能性があります。
ステファンChazelas

16

の名前条件を反転するだけですfind

find . -type f \! -name "*999*" 

追加-deleteまたは-exec rm {} +実際にマッチしたファイルを削除します。


2
!で安全ですbash
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.