私はそれに慣れておらず、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
。)