1つのファイルを除くすべてのファイル/ディレクトリを削除する


244

多数のファイルを含むディレクトリがあります。file.txtを除くすべてのファイルを削除します。どうすればいいですか?

不要なファイルを個別に削除するにはファイルが多すぎるため、その名前は多様であるため、*を使用してこの1つのファイル以外のすべてを削除することはできません。

誰かが使用することを提案しました

rm !(file.txt)

しかし、それは機能しません。戻ります:

Badly placed ()'s 

私のOSはScientific Linux 6です。

何か案は?


13
保持したいものを移動してから、他のrmを移動しますか?
オリビエデュラック14

5
@OlivierDulacこの質問で、質問を考え直していないのは私たちだけですか?
シャドゥール14

1
@shadur:そうですね、onelinersは魅力的です... ^^
オリビエデュラック14

1
おかげで、はい、1行のソリューションを探していました。ファイルを頻繁に移動する必要があるため、ファイルを移動し続けるには時間がかかりすぎます。
カントゥラ14

回答:


288

POSIXly:

find . ! -name 'file.txt' -type f -exec rm -f {} +

を除くすべての通常のファイル(再帰的に、隠しファイルを含む)を削除しますfile.txt。ディレクトリを削除するには、に変更-type f-type d-rオプションを追加しますrm

bash使用するには、rm -- !(file.txt)あなたがしなければならないextglobを有効にします

$ shopt -s extglob 
$ rm -- !(file.txt)

(または呼び出しbash -O extglob

Kornシェルファミリでextglobのみ機能することに注意してくださいbash。また、使用rm -- !(file.txt)するとArgument list too longエラーが発生する可能性があります。

ではzshextendedglobを有効にして^パターンを無効にするために使用できます。

$ setopt extendedglob
$ rm -- ^file.txt

またはと同じ構文を使用kshし、bashオプションでksh_globかつno_bare_glob_qual有効。


9
ディレクトリを指定することをお勧めします(この場合はフルパス?または、このコマンドが現在の作業ディレクトリから始まるすべてのファイルを削除するという警告をここに追加しますか?)。また、私は通常rmecho rm代わりにasを使用して任意の例を記述し、人々が本当に望んでいることを行うことが確実な場合にのみエコーを取り出すように依頼します。それ以外は、徹底的な回答のために+1
オリビエデュラック14

11
-delete代わりに-exec、より短く、覚えやすいことをお勧めします
イズカタ14

6
@Izkata:-deletePOSIXでは定義されていません。
クオンルム14

5
ファイルのリストを除外する方法は?
Meysam 14

5
@Meysam-ファイルのリストを処理するソリューションの私の答えを参照してください。それ以外の場合は、Gnoucのfindソリューションを使用できます! \( -name one_file -o -name two_file \)
mikeserv 14

112

別の方向をとる(ファイル名にスペースがない場合)

ls | grep -v file.txt | xargs rm

または(ファイル名にスペースが含まれていても機能します)

ls | grep -v file.txt | parallel rm

からman grep

 -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v is specified by POSIX)

2
ファイル名にスペースが含まれている場合は機能しません
Matteo

1
Ciao @Matteo、スペースを含むファイルでも機能しますが、grep-patternを引用符で囲む必要があります(例:)ls | grep -v "a file with spaces.bin" | xargs rm。これは通常のgrep構文です。
セバスチャン

1
問題@Sebastianないですgrepけどrmrmスペースで区切られた引数のリストを取得します。試してみてくださいtouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm:あなたが得るだろうrm: c: No such file or directoryrm: d: No such file or directory
マッテオ

1
はい、これは一般的な問題です。オプションを参照してください-print0find-0ではxargs。これは回避策ですが、少し不便です。find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm。ちなみに、gnu parallelはこれをうまく処理します(ほとんどの場合、xargsの代わりとして使用します。– ls | grep -v 'a b' | parallel rm
Sebastian

1
スペースだけでなく、すべて空白と改行だけでなく、引用符文字(単一、二重引用符、バックスラッシュ)とで始まるファイル名も含まれます-
ステファンシャゼル16

32

コピーを維持し、すべてを削除し、コピーを復元します。

{   rm -rf *
    tar -x
} <<TAR
$(tar -c $one_file)
TAR

1行で:

{ rm -rf *; tar -x; } <<< $(tar -c $one_file)

しかし、それにはhere-stringsをサポートするシェルが必要です。


10
これはやや驚くべきことです。
vschum

2
@Derek-編集をご覧ください。
mikeserv 14

2
しかし、これが途中で中断された場合、または何か他の問題が発生した場合、ファイルは削除されます。
カスペルド14

2
@kasperd-いいえ。親シェルは、それが実行されるまでの間に死亡した場合のみrmtar -xrm必要なだけ失敗する可能性があります。
mikeserv 14

2
別のディレクトリに移動して元に戻す方が効率的ではありませんか?ファイルのコンテンツを処理する必要はなく、パスのみを処理する必要があります。
レオンブロ14

23

あなたはすべてこれを考え直しています。

cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/

できた

編集実際、もっと簡単:

cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/

3
それは私の答えと同じです。expt [pt dirのパーミッションは失われません。
mikeserv 14

6
/ tmpとは別のファイルシステムにある大きなファイルで、ファイルシステムのルートからすべてを削除しようとしている場合、安全な場所に移動することは選択肢ではないかもしれません。
ジョニー14

1
これは間違いなく最も簡単な答えです。
ベンリャナージュ

17

Scientific Linux 6 OSでは、これは機能します。

shopt -s extglob
rm !(file.txt)

また、仮想マシンにDebian 32ビットをインストールしています。上記は機能しませんが、以下は機能します。

find . -type f ! -name 'file.txt' -delete

1
find私が提供した解決策が機能しなかったということですか?
クオンルム14

「機能しなかった」または「機能していません」。はい、検索ソリューションも機能します。ありがとう。
カントゥラ14

1
もっと詳しくできますか??どのように「それは他のファイルを削除しない作業、またはそれが削除されなかったfile.txtか、他の何か?
cuonglm

Debian OSでは、「$ rm!(file.txt)」は「Badly Placed() 's」を返します。そこで、「$ shopt -s extglob」を試しましたが、「shopt:Command not found」が返されました。次に、「検索」ソリューションを試しました。動作します。
カントゥラ14

1
ああ、もちろんそれは機能しません。組み込みでshoptはありませんtcsh
クオンルム14

10

rm !("file.txt")代わりに使用rm !(file.txt)


4
それはまったく違いはありません。ここでの問題は、OPが1)この形式をサポートするシェルを使用していないこと、2)bashでさえ、で有効にする必要があることshopt -s extglobでした。いずれにせよ、そのような単純なファイル名を引用しても違いはありません。
テルドン

1
utilsフォルダーだけを保持するには
-rm

7

別の答えを与えるために、rmフォルダを削除しないというデフォルトの動作を使用できます。

mkdir tmp && mv file.txt tmp  # create tmp dir and move files there
rm                            # delete all other files
mv tmp/* . && rm -rf tmp      # move all files back and delete tmp dir

1

このアプローチは非常にシンプルで、機能し、特別な拡張機能は必要ありません(知っている!)

ls --hide=file.txt | xargs rm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.