我在我的一个脚本的末尾使用以下代码来统计我已处理并移动到该目录中的文件数量。
# Report on Current Status
echo -n "Cropped Files: "
ls "${Destination}" | wc -l
我的问题在于如何处理重复文件。截至目前,我首先检查文件是否存在(因为我的脚本本质上对我正在处理的源文件具有破坏性)。如果它检测到该名称的文件已被处理,我会按如下方式更改文件名。
重复文件:foo.pdf
更改名称:foo.x.pdf
如果有 foo.x.pdf,那么我再次重命名为 foo.xx.pdf。根据需要重复。我打算稍后再评估每个“版本”,然后选择最好的一个保留。但我的问题就在这里。我想计算不包含 .x. .xx. 等的文件数量。如何从输出中删除这些文件,ls
以便wc -l
只计算唯一文件?
TL;DR:如何获取给定目录中文件名中不包含给定子字符串的文件数?
答案1
要查找目录中不包含的文件数.x.pdf
,请尝试:
find "${Destination}" -mindepth 1 ! -name '*.x.pdf' -printf '1' | wc -c
要查找目录中不包含句点(一个或多个)的文件数 -x
句点 - pdf
,请尝试:
find "${Destination}" -mindepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
以上代码通过子目录进行递归搜索。如果您不想这样做,请添加选项-maxdepth 1
。例如:
find "${Destination}" -mindepth 1 -maxdepth 1 ! -regex '.*\.x+\.pdf' -printf '1' | wc -c
请注意,因为我们使用-printf '1'
,所以即使目录包含名称中包含换行符的文件,此方法也是安全的。
答案2
没有子目录:
echo $(($(for file in *.sh ; do echo -n 1+; done; echo 0;)))
因为:
for file in *.sh ; do echo -n 1+; done; echo 0;
1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+0
答案3
您可以ls
使用(一次或多次)选项-I
,--ignore=PATTERN
(参考):
ls -I "*.x*.pdf" "${Destination}" | wc -l
或者你可以按以下方式使用减法:
echo $(($(ls "${Destination}" | wc -l) - $(ls "${Destination}"/*.x*.pdf | wc -l)))