我试图理解为什么该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
并且仅删除一周前的匹配文件。
此外,如果当前目录中有任何与某个模式匹配的文件,则该模式将被匹配文件列表替换。如果模式与当前目录中的一个文件完全匹配,则仅匹配子目录中的同名文件;如果它匹配两个或多个文件,则会出现语法错误。
您正在寻找的命令是
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)