web-dev-qa-db-ja.com

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

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

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

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

rm !(file.txt)

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

Badly placed ()'s 

私のOSはScientific Linux 6です。

何か案は?

275
Kantura

POSIXly:

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

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

bashrm -- !(file.txt)を使用するには、 enable extglob を使用する必要があります。

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

(または_bash -O extglob_を呼び出す)

extglobbashおよびKorn Shellファミリーでのみ機能することに注意してください。また、rm -- !(file.txt)を使用すると、_Argument list too long_エラーが発生する場合があります。

zshでは、_^_を使用して extendedglob を有効にしてパターンを否定できます。

_$ setopt extendedglob
$ rm -- ^file.txt
_

または、kshおよびbashで同じ構文を使用し、オプション_ksh_glob_および_no_bare_glob_qual_を有効にします。

323
cuonglm

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

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)
124
Sebastian

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

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

1行で:

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

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

35
mikeserv

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

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

できました。

[〜#〜] edit [〜#〜]実際には、より簡単です:

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

私のScientific Linux 6 OSでは、これは機能します:

shopt -s extglob
rm !(file.txt)

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

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

rm !("file.txt")の代わりにrm !(file.txt)を使用します

12

別の答えを出すために、フォルダーを削除しないという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
8
Nithin

このアプローチは非常にシンプルで機能し、特別な拡張機能を必要としない(私が知っている!)

ls --hide=file.txt | xargs rm
4
2-bits