显示文件大小的下限和上限,而不使用“find”

显示文件大小的下限和上限,而不使用“find”

我需要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,duls来获取尺寸。后两者需要检查目标是否是目录或常规文件:

    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,它们的语法和功能可能有所不同。)

相关内容