在 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_files
为check_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
)并且您想查看指向的文件(您肯定会这样做),请更改find
为find -L
.
您不需要有单独的check_files
脚本;你可以做
xargs -d '\n' < paths.txt sh -c 'find "$@" -size +800c -print' sh
如果需要,再次更改find
为。find -L