为什么“find”不删除它找到的文件?

为什么“find”不删除它找到的文件?

我试图理解为什么该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)

相关内容