複数のファイルがあるディレクトリがあるとします。これらのファイルはすべて、バイナリファイル(拡張子が宣言されていないファイル)とソースファイル(.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ツールは)です。