繁体   English   中英

bash将某些文件名打印为文本

[英]bash to print certain file names to text

过去几周我花了很多时间在这里发帖。 最后,我认为我与bash的学习更加紧密,但是我的代码存在一个问题,我一生无法解决为什么它无法运行的问题。 我可以在终端中运行每一行,它返回一个结果,但是由于某种原因,当我将其指向运行时,它什么也没做。 我收到一个语法错误:单词意外(期望“做”)。

#!/bin/bash

image="/Home/Desktop/epubs/images"

for f in $(ls "$image"*.jpg); do
    fsize=$(stat --printf= '%s' "$f");
    if [ "$fsize" -eq "40318" ]; then
       echo "$(basename $f)" >> results.txt
    fi
done

我想念什么???

问题可能出在行尾。 确保您的脚本文件具有unix行结尾,而不是Windows。

同样,不要迭代ls输出。 在外壳中使用globing:

for f in "$file"/*.jpg ; do

这就是我要做的。

#!/bin/bash -e

image="/Home/Desktop/epubs/images"

(cd "$image" 
 for f in *.jpg; do
   let fsize=$(stat -c %s "$f")
   if (( fsize == 40318 )); then
     echo "$f"
   fi
 done) >results.txt

-e表示如果出现任何问题(例如,无法cd进入目录),脚本将退出。 对这种行为感到满意时,可以节省很多错误检查。

括号表示cd命令位于子外壳中; 周围的脚本(包括重定向到results.txt )仍然位于您开始的任何目录中。

现在我们位于目录中,我们只需查找*.jpg ,无需目录前缀,也无需在任何basename上调用basename

使用let(( == ))会将大小值视为数字而不是字符串,因此我们不会因stat选择格式化值的方式而感到困惑。

我们只将整个循环的输出重定向到结果文件中,而不是每次都追加。 效率更高。 如果要保留results.txt中的现有内容,则可以将>改回>> ,但是将其保留在整个循环中仍然比打开文件并在每次迭代时附加到文件中更有效。

您的for循环似乎缺少要迭代的值列表:

image="/Home/Desktop/epubs/images"
for f in $(ls "$image"*.jpg); do

因为$image不以/结尾,所以您的ls命令扩展为

for f in $(ls /Home/Desktop/epubs/images*.jpg); do

这可能导致

for f in ; do

导致语法错误。 最简单的解决方法是

for f in $(ls "$image"/*.jpg); do

但是您应该在其他答案中采纳建议,然后跳过ls

for f in "$image"/*.jpg; do

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM