StackOverflow上的第一篇文章,第一次使用Bash。
我目前正在尝试构建一个函数来读取文件,然后根据状态给我输出:
我知道代码到目前为止粗糙,但我真正需要帮助的是递归循环部分。如何使用While循环遍历目录的内容?
#!/bin/bash
function fileChecker f {
if [-e $1 ]; then
if [ -f $1]; then
SIZE = 'du -k $1 | cut -f1'
CONTENT = 'file $1 | cut -d':' -f2'
echo $1 +" " + $SIZE + " " + $CONTENT
elif[ -h $1 ]; then
LINK = get info from $1
echo $1 + " " + "symbolic link " + $LINK
elif [ -d $1 ]; then
while [ ???? ]; do
fileChecker n
do
else
echo $1 + "unknown"
fi
fi
}
提前致谢!
答案 0 :(得分:3)
没有什么能阻止你递归调用你的函数,如下所示:
fileChecker() {
# ...
for f in "$1"/*; do
fileChecker "$f"
done
}
这是您的脚本,其中包含一些修复程序(*),其行为如下所述:
#!/bin/bash
fileChecker() {
if [ -f "$1" ]; then
size=$(du -k "$1" | cut -f1)
content=$(file "$1" | cut -d':' -f2)
echo "$1 $size $content"
elif [ -h "$1" ]; then
link=$(readlink -f "$1")
echo "$1 symbolic link $link"
elif [ -d "$1" ]; then
for f in "$1"/*; do
[ -e "$f" ] || [ -h "$f" ] && fileChecker "$f"
done
else
echo "$1 unknown"
fi
}
(*)修正:
[
命令之前和之后的正确间距"$1"
)-f
已经检查文件是否存在(并且是常规的)$(cmd ...)
而不是反引号(更简单,更易读)echo
readlink -f
进行符号链接目标请注意,for f in "$1"/*
不会循环遍历以点开头的文件名(“隐藏文件”)。另请注意[ -e "$f" ] || [ -h "$f" ]
之前的fileChecker
检查,以防止在"$1"/*
上调用它,以防glob不扩展(当dir "$1"
中没有文件时)。