![](/img/trans.png)
[英]count files found by find function in a shell script and save them in an array
[英]How to find files and count them (storing the info into a variable)?
我想根据找到的文件数进行条件操作:
found=$(find . -type f -name "$1")
numfiles=$(printf "%s\n" "$found" | wc -l)
if [ $numfiles -eq 0 ]; then
echo "cannot access $1: No such file" > /dev/stderr; exit 2;
elif [ $numfiles -gt 1 ]; then
echo "cannot access $1: Duplicate file found" > /dev/stderr; exit 2;
else
echo "File: $(ls $found)"
head $found
fi
编辑代码(以更准确地反映我的需求)
但是,当找到重复文件时,numfiles不等于2(或更大)...
所有文件名都位于一行中,并以空格分隔。
另一方面,这可以正常工作:
find . -type f -name "$1" | wc -l
但我不想在if / then / else构造中进行两次递归搜索...
添加-print0
也无济于事。
什么会?
PS-始终欢迎简化或改进!
使用$()
将数据存储到变量会修剪尾部空白。 由于最后的换行符未出现在变量numfiles
,因此wc误计数了一个。 您可以使用以下方法恢复尾随的换行符:
numfiles=$(printf "%s\n" "$found" | wc -l)
如果found
为空(并且任何文件名包含换行符),则会发生错误计数,从而强调了整个方法都存在错误的事实。 如果您真的想这样做,可以尝试:
numfiles=$(test -z "$numfiles" && echo 0 || printf "%s\n" "$found" | wc -l)
或将find的输出通过管道传递给脚本,该脚本对输出进行计数并打印计数以及第一个文件名:
find . -type f -name "$1" | tr '\n' ' ' |
awk '{c=NF; f=$1 } END {print c, f; exit c!=1}' c=0 |
while read count name; do
case $count in
0) echo no files >&2;;
1) echo 1 file $name;;
*) echo Duplicate files >&2;;
esac;
done
如果任何路径名包含空格,所有这些解决方案都会惨遭失败。 如果那很重要,您可以将awk更改为perl脚本,以使其更容易处理空分隔符并使用-print0,但实际上我认为您应该不再担心特殊情况。 (找到-exec和find | xargs都不能干净地处理0个匹配大小写的文件。可以说,这个awk解决方案也不能干净地处理它。)
您要find
文件并计数名称为“ $ 1”的文件:
grep -c "/${1}$" $(find . 2>/dev/null)
并将结果存储在var中。 在一个命令中:
numfiles=$(grep -c "/${1}$" <(find . 2>/dev/null))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.