使用bash,一个人如何能得到的文件数量的文件夹中,从shell脚本不包括目录,而解释抱怨?
在朋友的帮助下,我已经试过
$files=$(find ../ -maxdepth 1 -type f | sort -n)
$num=$("ls -l" | "grep ^-" | "wc -l")
从该命令行返回:
../1-prefix_blended_fused.jpg: No such file or directory
ls -l : command not found
grep ^-: command not found
wc -l: command not found
分别。 这些命令在命令行上工作,但不能与一个bash脚本。
鉴于充满了格式化像图像文件的文件1-pano.jpg
,我想抓住目录中的所有图像,以获得最大的编号的文件钉到正在处理的下一个图像。
为什么不一致?
该报价是导致该错误消息。
要获得目录中的文件的数量:
shopt -s nullglob
numfiles=(*)
numfiles=${#numfiles[@]}
它创建一个数组,然后与它的元件的计数替换它。 这将包括文件和目录,而不是点文件或.
或..
或其他点目录。
使用nullglob
所以空目录给出的0而不是1计数。
您可以改用find -type f
或者你可以指望的目录和减:
# continuing from above
numdirs=(*/)
numdirs=${#numdirs[@]}
(( numfiles -= numdirs ))
另请参阅“ 我如何可以找到最新的(最新的,最早的,最古老的)目录中的文件吗? ”
只要你想执行块里面你可以有很多的空间。 他们往往有助于可读性。 唯一的缺点是,它们使文件大了一点,可能(只)稍慢初步分析。 有迹象表明,必须有空格的几个地方(例如,围绕[
, [[
, ]
, ]]
和=
的比较)和少数不得(例如,围绕=
在分配中。
ls -l | grep -v ^d | wc -l
一条线。
怎么样:
count=$(find .. -maxdepth 1 -type f|wc -l)
echo $count
let count=count+1 # Increase by one, for the next file number
echo $count
请注意,此解决方案是效率不高:它产生的子炮弹find
和wc
的命令,但它应该工作。
file_num=$(ls -1 --file-type | grep -v '/$' | wc -l)
这是比find命令有点轻量,并计算当前目录下的所有文件。
摆脱报价。 外壳采用对待他们就像一个文件,所以它寻找“ls -l命令”。
简单有效的方法:
#!/bin/bash
RES=$(find ${SOURCE} -type f | wc -l)
扩大对接受的答案(由Dennis W):当我尝试这个方法,我在猛砸4.4.5得到了迪尔斯不正确计数没有子目录。
的问题是,通过默认了nullglob未击并设置numdirs=(*/)
设置与水珠图案的1个元件阵列*/
。 同样我怀疑numfiles=(*)
将具有为一个空文件夹1个元件。
设置shopt -s nullglob
禁用nullglobbing解决了我的问题。 对于为什么在了nullglob不猛砸设置默认的精彩讨论看到这里的答案: 为什么没有了nullglob违约?
注:我会直接回答评论,但缺乏美誉度点。
这里有一种方法可以做到这一个功能。 注意:您可以通过这个例子中,(目录数)显示目录,文件对文件计数或“全部”的目录中的一切计数。 因为我们不希望做不遍历树。
function get_counts_dir() {
# -- handle inputs (e.g. get_counts_dir "files" /path/to/folder)
[[ -z "${1,,}" ]] && type="files" || type="${1,,}"
[[ -z "${2,,}" ]] && dir="$(pwd)" || dir="${2,,}"
shopt -s nullglob
PWD=$(pwd)
cd ${dir}
numfiles=(*)
numfiles=${#numfiles[@]}
numdirs=(*/)
numdirs=${#numdirs[@]}
# -- handle input types files/dirs/or both
result=0
case "${type,,}" in
"files")
result=$((( numfiles -= numdirs )))
;;
"dirs")
result=${numdirs}
;;
*) # -- returns all files/dirs
result=${numfiles}
;;
esac
cd ${PWD}
shopt -u nullglob
# -- return result --
[[ -z ${result} ]] && echo 0 || echo ${result}
}
使用功能的例子:
folder="/home"
get_counts_dir "files" "${folder}"
get_counts_dir "dirs" "${folder}"
get_counts_dir "both" "${folder}"
将打印类似:
2
4
6