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


11

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

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

file_1.pnganother_file.jpgsome_music.mp3

回答:


14

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 {} +

3
オプションのシェル動作を戻す方法を含めると役立つ場合があります(shopt -u extglob)。
geedoubleya 2014年

7

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

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

mv tmp/* .
rmdir tmp

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

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


tmpディレクトリへのファイルの移動はいい感じです。とにかく、これはコマンドラインで行う必要があります。ありがとう!
AGamePlayer 2014年

3
@AwQiruiGuo tmpには、最初にファイルを2つのセットに分離してから、不要なファイルを取り返しのつかないように削除するという利点があります。そのlsため、保存したいファイルを見逃していないかどうかを確認するためにを実行できます。
Anthon 2014年

2

保持するファイルの名前をテキストファイルに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バイトで区切られた一連の行として扱います。

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


ファイル名に改行を含めることができるため、これは機能しません。
Anthon、2014年

@Anthonは、改行を含む空白を含むファイル名に対処するために、find、grep、xargsのオプションを変更しました
Mathias Weidner

使用したい場合findは、むしろやりたいfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
jimmij 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.