刚刚开始了脚本编写课程,需要一些帮助。我正在编写一个脚本来检查给定目录中每个文件和目录的文件名,并累积每个文件、子目录、符号链接、旧文件、图形文件、tmp 文件、exe 文件的计数以及每个文件的总字节数在该目录中。
输出需要按以下方式格式化:
- 目录 n,nnn,nnn
- 文件 n,nnn,nnn
- ETC...
当我运行脚本时,它似乎没有计算任何内容,因为所有计数项都返回 0。我在将数字格式化为逗号时也遇到问题。 $1 是用户运行脚本时将输入的搜索目录,即:./srpt /etc。为了运行搜索,我使用 find 命令和 printf 来格式化输出,并将输出通过管道传输到 wc 以计算行数。我认为这会给我授予文件名只是一行的文件数。可能有十亿种方法可以做到这一点,这种方法可能不是最优雅的,但我会感谢任何人的意见。
if [ -d "$1" ]; then
directories=$(find "$1" -type d -printf "%'d" | wc -l)
files=$(find "$1" -type f -printf "%'d" | wc -l)
sym=$(find "$1" -type l -printf "%'d" | wc -l)
ETC...
#Printing the output to the terminal
echo "Directories" $directories
echo "Files" $files
echo "Sym links" $sym
exit 0
else
echo "[ERROR]: need path to perform search"
exit 1
fi
我的输出:
Directories 0
Files 0
Sym Links 0
答案1
您需要将命令更改为以下形式:
directories=$(printf "%'d\n" $(find "$1" -type f | wc -l))
printf
使用当前区域设置的千位分隔符,该分隔符可能是逗号、点或什么都没有。如果您想强制使用逗号,您可以更改区域设置。
另外,你还可以通过这样的方式来做:
if [ -d "$1" ]; then
directories=$(find "$1" -type d | wc -l)
files=$(find "$1" -type f | wc -l)
sym=$(find "$1" -type l | wc -l)
并替换echo
为printf
#Printing the output to the terminal
printf "%s %'d\n" "Directories" $directories
printf "%s %'d\n" "Files" $files
printf "%s %'d\n" "Sym links" $sym
发生错误是因为您混淆了两个不同的命令 - bashprintf
和 find -printf
。
对于查找的-printf
格式"%'d"
不正确。不允许使用单引号,单引号%d
是文件在目录树中的深度。您可以通过键入:找到-printf
中的所有选项。man find
/printf format
顺便说一句,它需要添加\n
到两者printf
(bash 和 find):"%d\n"
,否则它们将在一行中打印所有输出。
答案2
-printf "%'d"
那里什么也没做,所以计数结果为 0,你需要用它来改变它-printf "%p\n"
。