名前に文字列 '999'( ''なし)が含まれていないファイルを削除したい。
私が試してみました:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
しかし、どれも機能しません。私はmacOS Sierraとbash:3.2.57を使用しています。
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
を探すことに注意してください。
find
の名前条件を逆にするだけです。
find . -type f \! -name "*999*"
追加 -delete
または-exec rm {} +
一致したファイルを実際に削除します。