3

1つのファイル(abc.txtなど)を除いて、現在のディレクトリ内のすべてのファイルを削除する必要があります。abc.txtを除くディレクトリ内の他のすべてのファイルをrmするコマンドはありますか?

4

4 に答える 4

5

簡潔なコマンドを実行している場合は、bashで拡張グロブを使用すると、次のコマンドを使用できるようになります。

rm !(abc.txt)

ただし、このアプローチにはいくつかの注意点があります。

  1. これは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.
    
  2. !(abc.txt)非常に長いファイルのリストを返す場合、悪名高い「引数リストが長すぎます」というエラーが発生する可能性があります。繰り返しfindますが、この問題の解決策になります。

  3. 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
    
于 2012-09-17T09:23:52.243 に答える
3

1)

mv abc.txt ~/saveplace
rm *
mv ~/saveplace/abc.txt .

2)

find . ! -name abc.txt -exec rm {} "+"
于 2012-09-17T10:35:18.757 に答える
2

試す

find /your/dir/here -type f ! -name abc.txt -exec rm {} \;
于 2012-09-17T09:29:25.937 に答える
1

名前にスペースが含まれるファイルがない場合は、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
于 2012-09-17T09:28:15.840 に答える