複数のファイルがあるディレクトリがあるとします。これらのファイルはすべて、バイナリファイル(拡張子が宣言されていないファイル)とソースファイル(.c)のいずれかです。 拡大)。私はこれを行います:
$ ls
取得:
README.md hello-world.c hello-world get-name.c get-name
特定の拡張子(たとえば、.cの両方)を持つファイルのみを一覧表示したい および.md )、私はします:
ls *.c *.md
大丈夫です!
しかし、削除しないすべてのファイルを削除したい場合はどうすればよいですか。 .cがあります または.md 拡張機能、どうすればこれを行うことができますか?
次のように、拡張子がわかっているファイルに対してそれを行う方法を知っています。
ls *.c *.md | xargs rm
ただし、しないファイルを削除するようにコマンドラインに指示するにはどうすればよいですか。 私の基準に一致しますか?
承認された回答:
findを使用する :
find -maxdepth 1 ! -name "*.c" -print0 | xargs -0 ...
-maxdepthに注意してください 、-print0 、-r および-0 いくつかのfindにあります 実装(GNU findによって導入されました / xargs )ただし、POSIXでは指定されていません。別の方法は、Stéphaneがコメントで述べたように、-execを使用することです。 検索のアクション–-exec command {} +を使用することを忘れないでください commandの呼び出し回数を大幅に減らすため、フォーム (ただし、ファイル名が最後に配置される構文を許可する必要があります。そうでない場合は、commandをラップする必要があります。 sh -c内 電話してください。
または、grep lsの出力
ls | grep -v ".c$" | xargs ...
正規表現を使用して、いくつかの拡張機能をフィルタリングできます。
... | grep -v ".(c|md)$" | ...
拡張正規表現を使用:
... | grep -Ev ".(c|md)$" | ...
固定文字列オプション付き(ファイル名の最後だけでは一致しません!):
... | grep -vF ".c
.md" | ...
または、より多くのgrepをチェーンすることによって s:
... | grep -v ".c$" | grep -v ".md$" | ...
そうは言っても、find -print0を使用するため、おそらく最良のオプションです。 オプションでは、他の方法でエスケープする必要がある可能性のあるファイル名内のすべての可能な文字を処理します(findを指定) およびxargs NULLで終了する文字列を処理できます-例: GNUツールは)です。