我需要vim
在 Linux 中创建一个名为between
.该脚本采用两个参数作为文件大小的下限和上限,并打印出文件名及其大小的列表。但是,我无法使用该find
命令来完成此脚本。
我已经做到了这一点:显示所有文件;但我似乎无法显示特定的没有find
.
#!/bin/bash
for i in *
do
set -- $(ls -l "$i")
echo $i: $5 bytes
done
答案1
你可以:
要检查范围,您可以使用
if
语句或continue
操作:if [[ $z -ge $1 || $z -le $2 ]] then : print result fi
或者
[[ $z -lt $1 || $z -gt $2 ]] && continue : print result
根据需要,测试选项有:
-ge
: 大于或等于-le
: 小于或等于-lt
: 少于-gt
: 比...更棒
使用
stat
,du
或ls
来获取尺寸。后两者需要检查目标是否是目录或常规文件:if [[ -f "$f" ]] then : a regular file fi
或者,为了防止 if 嵌套:
! [[ -f "$f" ]] && continue
文件大小,例如:
z=$(stat -c%s "$f") z=$(du -b "$f" | cut -f1) z=$(ls -l "$f" | cut -d' ' -f5)
要打印结果,您可以使用它
printf
来获得更干净的打印输出。即固定尺寸等。另请阅读此内容。如果你真的想表现得友善,也请验证论点......
#!/bin/bash
usage()
{
printf "Usage: %s <min-size> <max-size>\n" "$0" >&2
exit 1
}
! [[ "$1" =~ ^[0-9]+$ ]] && usage
! [[ "$2" =~ ^[0-9]+$ ]] && usage
for f in *
do
z=$(stat -c%s "$f")
# Alternatives to get size:
# ! [[ -f "$f" ]] && continue
# z=$(du -b "$f" | cut -f1)
# z=$(ls -l "$f" | cut -d' ' -f5)
if [[ $z -ge $1 || $z -le $2 ]]
then
printf "%11d %s\n" "$z" "$f"
fi
done
答案2
for i in *
do
size=$(stat --format="%s" "$i")
if [ $size -gt $1 -a $size -lt $2 ]
then
printf "Right-sized: %s\n" "$i"
else
printf "Wrong-sized: %s\n" "$i"
fi
done
这只是对循环的更新,但它不是解析 ls,而是使用 stat 来收集文件的大小(以字节为单位)。
此代码片段假设您已经对 $1 和 $2 进行了健全性检查——我不想这样做全部给你的作业!
答案3
您需要的是一个条件,在 shell 中具有以下语法:
if TEST
then
ACTION
else
ACTION
fi
对于测试,通常使用[
.例如,要检查是否$5
大于 25 但小于 50,您可以编写:
if [ "$5" -gt 25 ] && [ "$5" -lt 50 ]
then
echo "It's greater than 25 but is less than 50"
else
echo "It's either <= 25, or >= 50, or not a number at all"
fi
不要忘记引号(感谢@Wildcard 的提醒)和不要通过 [
超过四个参数(感谢@Jeff Schaller 的链接。)
查看Bash 初学者指南和高级 Bash 脚本编写指南,它们是一个很好的参考。
(但请注意,除了 Bash 之外还有其他 shell,它们的语法和功能可能有所不同。)