web-dev-qa-db-ja.com

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

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

私が試してみました:

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

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

9
plr

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で機能するようにした場合)。

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

18
Kusalananda

findの名前条件を逆にするだけです。

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

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

16
ilkkachu