多数のファイルを含むディレクトリがあります。 file.txtを除くすべてのファイルを削除したい。どうすればよいですか?
ファイルが多すぎて不要なファイルを個別に削除できず、ファイル名が多すぎるため、*を使用してこの1つのファイル以外のすべてを削除することはできません。
誰かが使用を提案しました
rm !(file.txt)
しかし、それは機能しません。それは返します:
Badly placed ()'s
私のOSはScientific Linux 6です。
何か案は?
POSIXly:
_find . ! -name 'file.txt' -type f -exec rm -f {} +
_
_file.txt
_を除くすべての通常のファイル(再帰的に、隠しファイルを含む)を削除します。ディレクトリを削除するには、_-type f
_を_-type d
_に変更し、_-r
_オプションをrm
に追加します。
bash
でrm -- !(file.txt)
を使用するには、 enable extglob を使用する必要があります。
_$ shopt -s extglob
$ rm -- !(file.txt)
_
(または_bash -O extglob
_を呼び出す)
extglob
はbash
およびKorn Shellファミリーでのみ機能することに注意してください。また、rm -- !(file.txt)
を使用すると、_Argument list too long
_エラーが発生する場合があります。
zsh
では、_^
_を使用して extendedglob を有効にしてパターンを否定できます。
_$ setopt extendedglob
$ rm -- ^file.txt
_
または、ksh
およびbash
で同じ構文を使用し、オプション_ksh_glob
_および_no_bare_glob_qual
_を有効にします。
別の方向に進む(ファイル名にスペースがない場合)
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)
コピーを維持し、すべてを削除し、コピーを復元します。
{ rm -rf *
tar -x
} <<TAR
$(tar -c $one_file)
TAR
1行で:
{ rm -rf *; tar -x; } <<< $(tar -c $one_file)
しかし、それにはhere-stringsをサポートするシェルが必要です。
あなたはすべてこれを考えすぎています。
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/
私のScientific Linux 6 OSでは、これは機能します:
shopt -s extglob
rm !(file.txt)
また、仮想マシンにDebian 32ビットをインストールしています。上記は機能しませんが、次は機能します。
find . -type f ! -name 'file.txt' -delete
rm !("file.txt")
の代わりにrm !(file.txt)
を使用します
別の答えを出すために、フォルダーを削除しないという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
このアプローチは非常にシンプルで機能し、特別な拡張機能を必要としない(私が知っている!)
ls --hide=file.txt | xargs rm