lau*_*ent 2 cygwin find delete
我试图了解为什么该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
Run Code Online (Sandbox Code Playgroud)
它返回我期望的文件:
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
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试使用 运行相同的命令-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
Run Code Online (Sandbox Code Playgroud)
我也尝试过-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 {} \;
Run Code Online (Sandbox Code Playgroud)
find
没有返回错误,文件归我所有,权限为 644。
知道是什么原因造成的吗?
(注意:我已经削减了命令以使其更具可读性,但通常没有换行符)
并列比-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 \)
Run Code Online (Sandbox Code Playgroud)
并且只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
Run Code Online (Sandbox Code Playgroud)
您可以将其缩写为
find C:\\path\\to\\Pictures\\pmcctv \
-regex '.*/cap_[^/]*\.\(jpg\|ogg\|flv\|mp4\|webm\)' \
-mtime +7 -delete
Run Code Online (Sandbox Code Playgroud)
或者您可以使用 zsh 尤其是它的glob 限定符 m
按修改时间匹配文件。
rm C:\\path\\to\\Pictures\\pmcctv/**/cap_*.(jpg|ogg|flv|mp4|webm)(md+7)
Run Code Online (Sandbox Code Playgroud)