`find -delete`はすべてを削除します

`find -delete`はすべてを削除します

私はそれに慣れておらず、find誤って多くのファイルを削除しました。経験豊富な人が私が間違っている部分を説明できるかどうか疑問に思います。


MacBookのFinderが私のRaspbian Samba共有に公開したすべてのファイルを整理したいと思います.DS_Store._.DS_Store

  • 私のラズベリーパイにハードドライブが接続されており、ホームフォルダにマウントポイントへのシンボリックリンクがあるので-L
  • 一部のフォルダはシステムユーザー(たとえばapache)が所有しているため sudo

findターゲットファイルが正しいことを確認するために、次のコマンドを実行しました。

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -name \*DS_Store\*
./.DS_Store
./Downloads/USBHDD1/._.DS_Store
./Downloads/USBHDD1/.DS_Store
./Downloads/USBHDD1/backups/ALAC/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/USBHDD1/backups/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/USBHDD1/backups/ALAC/.DS_Store
./Downloads/USBHDD1/backups/._.DS_Store
./Downloads/USBHDD1/backups/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/._.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/.DS_Store
./Downloads/USBHDD1/backups/OriginalMusic/FLAC/.DS_Store
./Downloads/USBHDD1/backups/Storage/._.DS_Store
./Downloads/USBHDD1/backups/Storage/.DS_Store
./Downloads/OriginalMusic/._.DS_Store
./Downloads/OriginalMusic/.DS_Store
./Downloads/OriginalMusic/FLAC/.DS_Store
./Downloads/ALAC/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/._.DS_Store
./Downloads/ALAC/Jeff Van Dyck - Assault Android Cactus OST/.DS_Store
./Downloads/ALAC/.DS_Store

すべてがよさそうだ!

次に、見つかったファイルを削除-deleteするフラグを追加しました。find

hydraxan@raspberry:~ $ sudo find -L . -maxdepth 255 -delete -name \*DS_Store\*
find: cannot delete `./Documents': Not a directory
find: cannot delete `./Pictures': Not a directory
find: cannot delete `./Music': Not a directory

私はそれが何らかの理由で私のシンボリックリンクを削除しようとしていることに気づいたときにそれを打ち、Ctrl+C約半分のデータを保存しました。

文書、写真、音楽がすべて消えた。おそらく、ほとんどすべてを保存した巨大なダウンロードフォルダを介して実行されているでしょう。


なぜfindこれらのファイルをすべて削除するのですか?私は-delete奇妙な場所に入れたのでしょうか?

答え1

findあなたの答えはマンページにあります。

削除オプションは、名前フィルタの前に処理されます。

       -delete
          Delete files; true if removal succeeded.  If the removal failed,
          an  error message is issued.  If -delete fails, find's exit sta‐
          tus will be nonzero (when it eventually exits).  Use of  -delete
          automatically turns on the -depth option.

          Warnings:  Don't  forget that the find command line is evaluated
          as an expression, so putting -delete first will make find try to
          delete everything below the starting points you specified.  When
          testing a find command line that you later intend  to  use  with
          -delete,  you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete  implies  -depth,  you  cannot
          usefully use -prune and -delete together.

削除オプションをコマンドの最後に移動できます。

または、次のようなものを使用できます。

find /path -name "*pattern*" | xargs rm -f

または

find /path -name "*pattern*" -exec rm -f {} \;

答え2

コマンドラインの基本原則findは、「条件と条件が一致したら...次に対処してください」です。タスクは最後にあります。これは、「タスクオブジェクトオブジェクト...」コマンドを呼び出す形式とはかなり異なります。

たとえば、find . -name \*DS_Store\* -delete*DS_Store*名前が一致した場合は削除」を意味します。条件とアクションを逆にすると、-deleteアクションに続く条件がないため、無条件に適用されます。

find . -delete -name \*DS_Store\*文法的誤りでない理由は行為も条件であるからである。操作が成功した場合、-delete条件はtrueであり、失敗した場合(たとえば、権限の不足のため)はfalseです。たとえば、find . -name somethingorother -delete -print正常に削除されたファイルの名前を印刷します。

構文エラーではない理由は、タスクがfind -name \*DS_Store\*ないと暗黙的な-printタスクがあるためです。この設計の理由は、印刷が非常に一般的なジョブ選択であるためです。

find(私の答えには完全な嘘は含まれていませんが、状況は少し単純化されています。私の答えの説明で扱われていないいくつかの機能、特に!論理演算子があります-o。)

関連情報