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

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

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

不要なファイルを個別に削除するにはファイルが多すぎます。

誰かが使用を提案しました。

rm !(file.txt)

しかし、これはうまくいきません。次を返します。

Badly placed ()'s 

私のオペレーティングシステムはScientific Linux 6です。

どんなアイデアがありますか?

答え1

POSIX的に:

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

名前付きディレクトリを除くすべての一般ファイル(隠しファイルを含む)を繰り返し削除しますfile.txt。ディレクトリを削除するには、に-type f変更してオプションを-type d追加します。-rrm

で をbash使用するには、rm -- !(file.txt)次の操作を行う必要があります。extglobの有効化:

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

(または電話bash -O extglob

Kornシェルシリーズextglobでのみ利用可能です。bash使用時にエラーが発生する可能性rm -- !(file.txt)がありますArgument list too long

以下を使用してパターンを否定zshできます。^グローバル拡張できるようにする:

$ setopt extendedglob
$ rm -- ^file.txt

kshまたはbash、オプションと同じ構文を使用しksh_globno_bare_glob_qual有効にします。

答え2

別の方向にもう一度やり直してください(ファイル名にスペースがない場合)。

ls | grep -xv "file.txt" | xargs rm

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

ls | grep -xv "file.txt" | parallel rm

からman grep

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

 
 -x, --line-regexp
          Select  only  those  matches  that exactly match the
          whole line.  For a regular expression pattern,  this
          is   like   parenthesizing   the  pattern  and  then
          surrounding it with ^ and $.

そうでない場合は-x保管しますmy-file.txt

答え3

コピーの維持、すべてのコンテンツの削除、コピーの復元:

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

一行:

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

しかし、ここにある文字列をサポートするシェルが必要です。

答え4

私のScientific Linux 6 OSでは、次のように動作します。

shopt -s extglob
rm !(file.txt)

また、仮想マシンにDebian 32ビットをインストールしました。上記の方法は機能しませんが、次の方法は機能します。

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

関連情報