見つかったファイルを「検索」として削除しないのはなぜですか?

見つかったファイルを「検索」として削除しないのはなぜですか?

find場合によっては、このコマンドがファイルを削除しない理由を理解したいと思います。次のコマンドがあります。

find C:\\path\\to\\Pictures\\pmcctv -name cap_*.jpg
-o -name cap_*.ogg -o -name cap_*.flv -o -name cap_*.mp4 -o -name cap_*.webm -mtime +7

私が期待するファイルを返します。

C:\path\to/Pictures/pmcctv/cap_20160915T193251_620067800.jpg
C:\path\to/Pictures/pmcctv/cap_20160915T193322_742708800.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081046_394767500.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081125_615129600.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081129_503678200.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T081255_842394600.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161008_693586800.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161012_749396800.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161043_774132200.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161150_497251900.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161154_437379600.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161337_350955300.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161341_452596000.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161412_870774000.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161443_969064400.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161554_468109900.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161558_378086000.jpg
C:\path\to/Pictures/pmcctv/cap_20160916T161916_668433100.jpg

これで:を使用して同じコマンドを実行しようとすると、-deleteファイルは削除されません。

find C:\\path\\to\\Pictures\\pmcctv -name cap_*.jpg -o -name cap_*.ogg
-o -name cap_*.flv -o -name cap_*.mp4 -o -name cap_*.webm -mtime +7 -delete

私も試しましたが、-exec rm削除されませんでした。

find C:\\path\\to\\Pictures\\pmcctv -name cap_*.jpg -o -name cap_*.ogg
-o -name cap_*.flv -o -name cap_*.mp4 -o -name cap_*.webm -mtime +7 -exec rm {} \;

findエラーは返されず、ファイルは権限644を持つ私が所有しています。

原因は何か知っていますか?

(注:読みやすくコマンドを削除しましたが、通常改行はありません。)

ベストアンサー1

接続は演算子よりも密接に結合されます-o。したがって、あなたのコマンドは次のようになります。

find C:\\path\\to\\Pictures\\pmcctv \( -name cap_*.jpg \) -o \
                                    \( -name cap_*.ogg \) -o \
                                    \( -name cap_*.flv \) -o \
                                    \( -name cap_*.mp4 \) -o \
                                    \( -name cap_*.webm -mtime +7 -delete \)

cap_*.webmそして、1週間を過ぎた一致するファイルだけが削除されます。

また、現在のディレクトリにパターンと一致するファイルがある場合、パターンは一致するファイルのリストに置き換えられます。パターンが現在のディレクトリのファイルと正確に一致する場合は、サブディレクトリにある同じ名前のファイルのみが一致し、複数のファイルと一致すると構文エラーが発生します。

あなたが探しているコマンドは

find C:\\path\\to\\Pictures\\pmcctv \
     \( -name 'cap_*.jpg' -o -name 'cap_*.ogg' -o -name 'cap_*.flv' -o -name 'cap_*.mp4' -o -name 'cap_*.webm' \) \
     -mtime +7 -delete

次のように短縮できます。

find C:\\path\\to\\Pictures\\pmcctv \
     -regex '.*/cap_[^/]*\.\(jpg\|ogg\|flv\|mp4\|webm\)' \
     -mtime +7 -delete

あるいは、zshを使用することもできます。特にグローバル予選 m変更時間ごとにファイルを照合します。

rm C:\\path\\to\\Pictures\\pmcctv/**/cap_*.(jpg|ogg|flv|mp4|webm)(md+7)

おすすめ記事