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)