web-dev-qa-db-ja.com

特定のファイルのみを除いて、フォルダー内のすべてのファイルを削除するにはどうすればよいですか?

特定のファイルのみを残して、ディレクトリ内のすべてのファイルを削除したいのですが、名前で共通するものはありません。どうすればそれを達成できますか?

たとえば、保持したいファイル名は次のとおりです。

file_1.pnganother_file.jpgsome_music.mp3

11
AGamePlayer

Bashを使用している場合:

_shopt -s extglob
rm -- !(file1|file2|file3)
_

最初の行は拡張パターンマッチングをアクティブ化するだけで、その後はそのうちの1つを使用します。

!(pattern-list)は、指定されたパターンの1つ以外のすべてに一致します

また、pattern-listは、_|_で区切られた1つ以上のパターンのリストです。


またはzsh

_setopt extendedglob
rm -- ^(file1|file2)
_

または、より移植性が高く、findを使用します。

_find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
_
15
jimmij

サブディレクトリtmpを作成し、保持するすべてのファイルをそのディレクトリに移動して、rm -f *その後。 tmpディレクトリには影響しません。

その後、次のようにします。

mv tmp/* .
rmdir tmp

(移動したファイルがドットで始まっていないと仮定します)。

これは、マウスと実際にできるNautilusのようなファイルブラウザを使用することが理にかなっている数少ないケースの1つです。 Ctrl保持するいくつかのファイルをクリックして、メニューを使用します:Edit -> Invert Selectionを使用して他のファイルを取得し、それらを削除します。

7
Anthon

保持するファイルの名前をテキストファイルに1行に1つずつ追加します。このファイルはディレクトリに配置しないか、ファイル名も追加する必要があります。

ディレクトリの名前がfooで、ファイルの名前がbarの場合は、次のようにします。

find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm

これは次のことを行います。

  1. find -type ffooとそのサブディレクトリ内のすべてのファイルの名前を検索し、それらをSTDOUTに出力します。オプション-print0ファイル名をNULバイトで区切ります。
  2. grep -v -f barbarの行に一致するすべてのファイル名を除外します。オプション-z入力をNULバイトで区切られた行のセットとして扱い、オプション-Z NULバイトで出力を制限します。
  3. xargs rmrmを繰り返し呼び出してファイルを削除します。オプション-0入力をNULバイトで区切られた行のセットとして扱います。

これは、空白を含むファイル名で機能します。

2
Mathias Weidner