仅当目录中的文件数大于1时才需要if语句来运行任务


1

我想写一个脚本,但是我想要一个if语句,所以只有当目录中的文件数大于1时它才会运行。这可能吗?


你有什么尝试?将当前脚本粘贴到问题中以征求更好的答案!
Ozair Kafray

脚本太大,无法放入此框中。我还没有尝试任何东西,因为我不知道如何做到这一点。
jlacroix82

1
@ jlacroix82:你可以粘贴脚本 引擎收录 并把链接放在这里。
fmanco

这是在Pastebin中: pastebin.com/4SGFHzVG 请注意,我对脚本非常敏感,除了我要求的附加功能之外,我不希望有任何改变。我把评论放在我想要的地方,以便在执行之前检查是否有多个文件。
jlacroix82

Answers:


3

就像是

[ "$(ls -b | wc -l)" -gt 1 ] && { ... your statements ... }

用if语句有没有办法做到这一点?
jlacroix82

这是一个(隐藏/缩写)if..then语句。全长,它会读 if [ "$(ls -b | wc -l)" -gt 1 ]; then ... your statements ...; fi
Izzy

无论目录中是否有多个文件,语句仍会运行。我应该将-gt 1增加到-gt 2吗?
jlacroix82

@jlacroix82:不要忘记这也会计算目录,而不仅仅是文件。因此,如果当前目录中有两个目录,即使没有文件,测试也会成功。
fmanco

除非计算在内,否则根本没有子目录。
jlacroix82

0

我需要用这个:

shopt -s nullglob
files=($dir/*) # $dir was declared earlier if you look at my script
if (( "${#files[@]}" >= 2 ));
     <statements>
fi
shopt -u nullglob

之所以在这里发布的解决方案都没有起作用的原因是由于以下原因。该脚本正在执行AGAINST目录的语句,它实际上不是CD'in IN到目录。通过告诉它我正在使用什么文件夹($ dir)它获得提示并按预期工作。


所以问题基本上就是我在评论中告诉你的。无论如何,我已经编辑了我的答案,所以你可以看到如何使用特定的目录,但我很高兴你找到了解决方案。
fmanco

0

我将使用类似的东西:

    dir=.
    nf=`find . -maxdepth 1 -type f | wc -l`

    if [ "$nf" -gt "1" ] ; then
            <do something here>
    fi

这种方法只算数 files 在指向的目录中 dir 并丢弃任何可能的子目录。

不要忘记改变 dir 根据您的需求。


刚尝试过,&lt;在这里做点什么&gt;即使目录中有文件,也不会运行。
jlacroix82

[test]语句可能不正确:它使用字符串(引号),但使用数字比较(-gt)。尝试替换该部分 [ $nf -gt 1 ] (用于数字比较)。如果你想用字符串来做,那应该是 [ "$nf" != "0" -a "$nf" != "1" ]。此外,您可以(出于测试目的)在以“if”开头的行之前输出存储在$ nf中的值。
Izzy

@Izzy:那是错的。 comparisson适用于Strings。
fmanco

@ jlacroix82:拜托。确保当前目录是您想要的。别忘了 find 正在查找当前目录中的文件。如果你想要你可以改变 find .find <directory>。你也可以把命令 pwd 在您的脚本中知道您当前的目录是什么。该脚本已经过测试,可以正常运行。
fmanco

@criziot:它可以工作(按字母数字排序,任何大于1的“字符串数字”从数字1开始或向上),但a)不好的风格和b)你永远不知道实现是否“string -gt string”得到了无声的转换。手册页 test 明确说明: INTEGER1 -gt INTEGER2: INTEGER1 is greater than INTEGER2。没有关于“-gt”的字符串。但我们不要争论 - 只要它有效;)
Izzy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.