2016-05-20 3 views
3

ありません。これは、私が働いているディレクトリの内容です:検索: `./folder ':そのようなファイルやディレクトリは

[email protected]:~/work/c/5$ ls -l 
total 8 
-rw-rw-r-- 1 misha misha 219 May 20 15:37 demo.c 
drwxrwxr-x 2 misha misha 4096 May 20 16:07 folder 
-rw-rw-r-- 1 misha misha 0 May 20 16:06 test 

今、私は、ファイルを除いて、このディレクトリからすべてを削除したいですdemo.c。ここで私が作ってみたコマンドです:

find . ! \(-name demo.c -o -name . \) -exec rm -Rf {} \; 

それはあなたが正確に何をそれは(意味、ファイルtestとディレクトリfolderはなくなっている)を行うだろうと思うが、したいん同時に、それも表示されます次のエラーメッセージが表示されます。

find: `./folder': No such file or directory 

なぜそれはだと思いますか?あなたがこれまであなたfindコマンド変更することができます

+1

を見つける 'てみてください。 -depth ... '、findはフォルダを削除した後に./folderを入力しようとします –

答えて

6
を削除します

それはまた、このエラーメッセージが表示されます。

find: `./folder': No such file or directory 

それはなぜですか?

それは最初それがfind基準に一致するかどうかを検討するか、または上の任意のアクションを実行する前に、ディレクトリ.を読み込むときfindはディレクトリとして./folder認識するので。アクションがそのディレクトリを削除することを認識しないので、アクションを実行した後、そのディレクトリに降りてその内容をスキャンしようとします。しかし、それを行うまでには、ディレクトリは存在しなくなりました。

問題を解決する方法は複数あります。まだ言及されていないものは、-pruneアクションを使用することです。これはテストに合わせディレクトリに下降しないfindを伝えます:

うまくここに役立ち、それはまた、あなたがディレクトリを削除されていない領域にアプリケーションを持っており、あなたが検索の深さを制限したくないだろう
find . ! \(-name demo.c -o -name . \) -exec rm -Rf {} \; -prune 

また、.への影響を回避する別の方法は、あなたが希望する場合、これらは通常のファイルを指定することができ、findをテストするために、複数のベースパスを受け入れているという事実を利用することになり、そしてファイル名にパス名展開中のいずれかの大手.こと明示的に一致させる必要があります。あなたの場合のように、(...以外の)ターゲットディレクトリにはドットファイルが存在しない、場合は、このようなあなたの目的を達成することができます

find * ! -name demo.c -exec rm -Rf {} \; -prune 
1
#before 


     ls -lrt 
     total 4 
     -rw-rw-r-- 1 user super 0 May 20 09:14 demo.c 
     drwxrwxr-x 2 user super 4096 May 20 09:14 folder/ 
     -rw-rw-r-- 1 user super 0 May 20 09:14 test 


#Command 
     ls -1 | grep -v demo.c |xargs rm -rf 
#After   
     ls -lrt 
     total 0 
     -rw-rw-r-- 1 user super 0 May 20 09:14 demo.c 
+0

' ls'はプログラム的な使用のために意図されておらず、安全でもありません - http://mywiki.wooledgeを参照してください。org/ParsingLs –

+0

また、 'grep -v demo.c'は' foo-demo.c'を除外します。これはOPの '-name demo.c'では除外されます。このコードは、それが置き換えられるものと全く同じではありません。 –

+0

ちょっと面白いことに、ファイルに名前に改行が含まれていると考えてください。 'touch $ 'cant \ ndelete \ nme''​​で作成されたものは' ls -1 | grep -v demo.c | xargs rm -rf'は 'xargs'不正行為(' -0'や '-d'のような拡張子はありませんが、設計上壊れている)のためだけでなく' ls -1'もできるのでその名前を改行で区切られた出力ストリームで明白に表します。 –

2

:あなたはDOT

  • -deleteを選択しないことを保証

    find . -mindepth 1 -not -name demo.c -delete 
    
    • -mindepth 1は、すべてのファイルとディレクトリ
  • +0

    Gotcha。私はこれを次のように書いていたはずです:find。 -maxdepth 1! \(-name demo.c -o -name。\)-exec rm -Rf {} \;私は-maxdepth 1を忘れました。 –

    +0

    'maxdepth 1'は現在のディレクトリ内のファイルとディレクトリのみを検索し、DOTを避けるために' mindepth 1 'を使用することができます。あなたのコマンドは: 'find。 -mindepth 1 - 最大深度1 - 名前なしdemo.c -delete' – anubhava

    関連する問題