我想知道如何运行一个简单的脚本" count.sh"与路径一起调用,例如:
count.sh /home/users/documents/myScripts
脚本需要遍历此路径中的目录,并在此路径的每个级别中打印多少个文件和文件夹(包括隐藏)。
例如:
(myScripts - 7,documents - 8,users -9,home - 10)
顺便说一句,我可以使用count.sh pwd
运行此脚本吗?
答案 0 :(得分:0)
您可以尝试以下
ls -Ab
(.
列出除..
和wc -l
以外的所有文件和文件夹,并转义特殊字符,这样即使文件名包含换行符,每个文件也只打印一行。{{1}计算行数。)
您可以使用
调用脚本count.sh `pwd`
答案 1 :(得分:0)
或多或少的那样:
#!/bin/sh
P="$1"
while [ "/" != "$P" ]; do
echo "$P `find \"$P\" -maxdepth 1 -type f | wc -l`"
P=`dirname "$P"`;
done
echo "$P `find \"$P\" -maxdepth 1 -type f | wc -l`"
您可以使用script.sh `pwd`
答案 2 :(得分:0)
另一种方法是使用数组处理分离或标记路径,并使用内部字段分隔符(IFS
)控制分词。如果需要,您可以包含根目录(在这种情况下,您需要修剪打印输出中的其他前导'/')
#!/bin/bash
[ -z "$1" -o ! -d "$1" ] && {
printf "error: directory argument required.\n"
exit 1
}
p="$1" ## remove two lines to include /
[ "${p:0:1}" = "/" ] && p="${p:1}"
oifs="$IFS" ## save internal field separator value
IFS=$'/' ## set to break on '/'
array=( $p ) ## tokenize given path into array
IFS="$oifs" ## restore original IFS
## print out path level info using wc
for ((i=0; i<${#array[@]}; i++)); do
dirnm="${dirnm}/${array[i]}"
printf "%d. %s -- %d\n" "$((i+1))" "$dirnm" $(($(ls -Al "$dirnm" | wc -l)-1))
done
示例输出
$ bash filedircount.sh /home/david/tmp
1. /home -- 5
2. /home/david -- 132
3. /home/david/tmp -- 113
作为替代方案,您可以使用for
循环遍历并计算每个级别的目录中的项目,而不是根据需要使用wc
。