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
}
提前感谢!
没有什么能
阻止你递归地调用你的函数,就像这样:
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
- POSIX-合规性(功能定义)
请注意,for f in "$1"/*
不会循环以点开头的文件名("隐藏文件")。另请注意,在调用 fileChecker
之前[ -e "$f" ] || [ -h "$f" ]
检查以防止在 glob 不展开的情况下调用它"$1"/*
(当目录 "$1"
中没有文件时)。