如何将文件夹中的文件数作为变量?

Jas*_*son 25 bash shell

使用bash,如何在没有解释器抱怨的情况下获取文件夹中的文件数,从shell脚本中排除目录?

在朋友的帮助下,我试过了

$files=$(find ../ -maxdepth 1 -type f | sort -n)
$num=$("ls -l" | "grep ^-" | "wc -l")
Run Code Online (Sandbox Code Playgroud)

从命令行返回:

../1-prefix_blended_fused.jpg: No such file or directory
ls -l :  command not found
grep ^-: command not found
wc -l:   command not found
Run Code Online (Sandbox Code Playgroud)

分别.这些命令在命令行上运行,但不适用于bash脚本.

如果文件中填充了格式化的图像文件1-pano.jpg,我想抓取目录中的所有图像,以获得最大编号的文件,以便处理下一个正在处理的图像.

为什么会出现差异?

Pau*_*ce. 39

引号导致错误消息.

要获取目录中的文件计数:

shopt -s nullglob
numfiles=(*)
numfiles=${#numfiles[@]}
Run Code Online (Sandbox Code Playgroud)

它创建一个数组,然后用它的元素数替换它.这将包括文件和目录,但不包括dotfiles或.or ..或其他虚线目录.

使用nullglob这样一个空目录给出的计数为0而不是1.

你可以使用find -type f或者你可以计算目录并减去:

# continuing from above
numdirs=(*/)
numdirs=${#numdirs[@]}
(( numfiles -= numdirs ))
Run Code Online (Sandbox Code Playgroud)

另请参阅" 如何在目录中找到最新(最新,最早,最旧)的文件? "

您可以在执行块中包含任意数量的空格.它们通常有助于提高可读性.唯一的缺点是它们会使文件变大,并且可能会稍微减慢初始解析(仅).有一些地方必须有空格(例如,围绕[,[[],]]=在比较中)和一些必须没有空间(例如=在任务中.

  • @Meisner:应该使用`nullglob.我编辑了我的答案.谢谢. (2认同)

mck*_*nzm 15

ls -l | grep -v ^d | wc -l
Run Code Online (Sandbox Code Playgroud)

一条线.

  • 这并不普遍正确。在大多数情况下,此调用将包含“total <NUM_BLOCKS_ALLOCATED>”行(因此计数过多,请参阅http://stackoverflow.com/questions/7401704/what-is-that-total-in-the-very-第一行-ls-l之后)。添加通配符以防止出现这种情况:ls -l * | grep -v ^d | | grep -v ^d | 厕所-1 (3认同)

Hai*_* Vu 13

怎么样:

count=$(find .. -maxdepth 1 -type f|wc -l)
echo $count
let count=count+1 # Increase by one, for the next file number
echo $count
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案效率不高:它为findwc命令生成子shell ,但它应该可以工作.