1つのファイル(abc.txtなど)を除いて、現在のディレクトリ内のすべてのファイルを削除する必要があります。abc.txtを除くディレクトリ内の他のすべてのファイルをrmするコマンドはありますか?
4 に答える
簡潔なコマンドを実行している場合は、bashで拡張グロブを使用すると、次のコマンドを使用できるようになります。
rm !(abc.txt)
ただし、このアプローチにはいくつかの注意点があります。
これは
rm
、ディレクトリ内のすべてのエントリ( "abc.txt"を除く)で実行され、サブディレクトリが含まれます。したがって、サブディレクトリが存在する場合、「ディレクトリを削除できません」というエラーが発生します。この場合は、find
代わりに次を使用してください。find . -maxdepth 1 -type f \! -name "abc.txt" -exec rm {} \; # omit -maxdepth 1 if you also want to delete files within subdirectories.
!(abc.txt)
非常に長いファイルのリストを返す場合、悪名高い「引数リストが長すぎます」というエラーが発生する可能性があります。繰り返しfind
ますが、この問題の解決策になります。rm !(abc.txt)
ディレクトリが空の場合、またはabc.txtが唯一のファイルである場合、失敗します。例:[me@home]$ ls abc.txt [me@home]$ rm !(abc.txt) rm: cannot remove `!(abc.txt)': No such file or directory
nullglobを使用してこれを回避できますが、単にを使用する方がクリーンな場合がよくあります
find
。説明のために、考えられる回避策は次のとおりです。shopt -s nullglob F=(!(abc.txt)); if [ ${#F[*]} -gt 0 ]; then rm !(abc.txt); fi # not pretty
1)
mv abc.txt ~/saveplace
rm *
mv ~/saveplace/abc.txt .
2)
find . ! -name abc.txt -exec rm {} "+"
試す
find /your/dir/here -type f ! -name abc.txt -exec rm {} \;
名前にスペースが含まれるファイルがない場合は、aを使用して次for
の結果をループできls
ます。
for FILE in `ls -1`
do
if [[ "$FILE" != "abc.txt" ]]; then
rm $FILE
fi
done
スクリプトとして記述することも、bashプロンプトで直接書き込むこともできます。最初の行を書き込んでからを押しenter
てから、他の行を書き込むことができます。bashは書き込みを待ってdone
から実行します。それ以外の場合は、1行で書くことができます:
for FILE in `ls -1`; do if [[ "$FILE" != "abct.txt" ]]; then rm $FILE; fi; done