指定されたファイルを除いて、フォルダ内のすべてのファイルを削除する方法は?

指定されたファイルを除いて、フォルダ内のすべてのファイルを削除する方法は?

名前に共通点がない指定された一部のファイルのみを維持しながら、ディレクトリ内のすべてのファイルを削除したいと思います。どうすればいいですか?

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

file_1.png、、、another_file.jpgsome_music.mp3

答え1

バッシュを使用する場合:

shopt -s extglob
rm -- !(file1|file2|file3)

最初の行は、拡張パターンマッチングを有効にした後、次のいずれかを使用します。

!(pattern-list)与えられたパターンの1つを除くすべての項目と一致

パターンリストは、で区切られた1つ以上のパターンのリストです|


またはzsh

setopt extendedglob
rm -- ^(file1|file2)

または、より移植性が高い場合は、以下を使用してくださいfind

find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +

答え2

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

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

mv tmp/* .
rmdir tmp

(移動するファイルの中からドットで始まるファイルがないとします。)

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

答え3

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

ディレクトリ名が次の場合金持ちファイル名は次のとおりです。バー、次の操作を行います。

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

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

  1. find -type fすべてのファイル名を検索金持ちそして対応するサブディレクトリをSTDOUTとして印刷します。-print0ファイル名をNULバイトで区切るオプションを使用してください。
  2. grep -v -f bar次の行に一致するすべてのファイル名を除外します。バー。 options は-z入力を NUL バイトで区切られた行セットとして扱い、 options を使用すると-Z出力を NUL バイトとして扱います。
  3. xargs rmファイルを削除するために繰り返し呼び出されますrm。オプションは、-0入力をNULバイトで区切られた行セットとして扱います。

これはスペースを含むファイル名に適用されます。

関連情報