if 条件抛出错误

if 条件抛出错误

在 bash 编码中,line3 是从 xyz/symlinks_paths.txt 获取的路径。

while read -r line3
do
    if [[ $(ls -lh $line3 | grep zzz.exe | grep '[8-9][0-9][0-9][MG]') -ne 0 ]] 
    then 
        echo $line3 >> xyz/size_list.txt
        exit 1
    fi
done < xyz/symlinks_paths.txt

该脚本向我抛出以下错误。 (h.sh 是脚本名称。)

h.sh: line 20: [[: -r--r--r-- 1 syncmgr GX 838M Dec  1 21:55 zzz.txt: syntax error in expression (error token is "r--r-- 1 syncmgr GX 838M Dec  1 21:55 zzz.txt")

答案1

这里的问题是您正在尝试解析ls.这是总是一个坏主意。看为什么*不*解析`ls`?解释为什么会出现这种情况。

如果您想要文件的大小,请使用stat.例如

minsize=$(( 800 * 1024 * 1024 ))

# alternatively, if you have `numfmt` from GNU coreutils, delete the line above
# and uncomment the following line:
#minsize=$(echo 800M | numfmt --from=iec)

while read -r line3 ; do
  if [ "$(stat -L --printf '%s' "$line3")" -gt "$minsize" ]; then
    echo "$line3" >>  xyz/size_list.txt
  fi
done < xyz/symlinks_paths.txt

注意:我在上面使用了stat's -L(又名--dereference)选项,因为输入文件名意味着其中列出的文件名可能是符号链接。如果没有-L,stat则不会跟随符号链接,它会打印符号链接本身的大小。


如果您希望将文件大小与文件名一起打印到输出文件,则循环while将更像以下所示:

while read -r line3 ; do
  fsize=$(stat -L --printf '%s' "$line3")

  if [ "$fsize" -gt "$minsize" ]; then
    fsize=$(echo "$fsize" | numfmt --to=iec)
    printf "%s\t%s\n" "$fsize" "$line3" >>  xyz/size_list.txt
  fi
done < xyz/symlinks_paths.txt

答案2

find这可以用( 和)来完成xargs,但它不会赢得任何选美比赛。

编写一个脚本,名为check_files

#!/bin/sh
find "$@" -size +800M –print

然后运行

xargs -d '\n' < xyz/symlinks_paths.txt ./check_files

在哪里

  • 您可以将< xyz/symlinks_paths.txt重定向移至命令行末尾(如 中)xargs -d '\n' ./check_files < xyz/symlinks_paths.txt,或移至开头或其他任何位置。或者您可以将其替换为-a xyz/symlinks_paths.txt.其中任何一个都意味着xargs将从 读取xyz/symlinks_paths.txt
  • 您可以替换./check_filescheck_files脚本的绝对路径名。

-d '\n'表示读取时使用换行符作为分隔符xyz/symlinks_paths.txt。如果您的文件名不包含空格(空格或制表符)、引号(请记住单引号 ( ') 与撇号是相同的字符)或反斜杠,则您可以将其保留,并且您可以愿意拿他们永远不会做的一年的薪水打赌。

这会读取文件的每一行并将其作为脚本的参数check_files,脚本将它们传递给find 作为初始点论点。许多人都知道您可以find 同时运行多个初始点论据;例如,

寻找dir 1 dir 2 dir 3  搜索表达式

众所周知,这些参数不一定是目录;它们可以是文件;例如,

寻找文件1文件2文件3  搜索表达式

(或目录和文件的混合)。  find将简单地应用表达 每个名为 a 的文件初始点

因此,这会检查列出名称的每个文件,xyz/symlinks_paths.txt 看看其大小是否为 800M 或更大,并打印这些文件。

如果文件名可能引用符号链接(顾名思义xyz/symlinks_paths.txt)并且您想查看指向的文件(您肯定会这样做),请更改findfind -L.

您不需要有单独的check_files脚本;你可以做

xargs -d '\n' < paths.txt sh -c 'find "$@" -size +800c -print' sh

如果需要,再次更改find为。find -L

相关内容