多くのファイルを含むディレクトリがあります。 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
追加します。-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
。
以下を使用してパターンを否定zsh
できます。^
グローバル拡張できるようにする:
$ setopt extendedglob
$ rm -- ^file.txt
ksh
またはbash
、オプションと同じ構文を使用しksh_glob
てno_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