我想在继续处理该文件之前检查是否只存在一个文件实例。
我可以使用此命令检查存在多少个实例:
ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l;
但是,当我在if语句中使用它时,我被警告ls: command not found
。
if [ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l = '1']
then
echo "Only 1 File Exists";
fi
我尝试在ls命令的末尾添加一个分号并将其括在方括号中 - 这些都没有产生任何结果。
我很少需要做任何Shell脚本,我怀疑这是一个非常基本的错误,所以任何帮助都会非常感激。
谢谢,
保罗。
答案 0 :(得分:4)
更改edx = 0x3F0
条件,如下所示:
if
if [ "$(ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l)" = "1" ]
之后和[
]
内运行命令将调用子shell并运行命令。$()
放在双引号内将避免在输出空的情况下抛出错误。答案 1 :(得分:3)
你快到了那里:
if [ $(ls $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz 2>/dev/null | wc -l) == 1 ]
then
echo "Only 1 File Exists";
fi
评估结果并与double equals进行比较。另外,在方括号前后放置空格。
此外,过滤掉没有文件匹配的情况(避免no such file or directory
错误)
注意:您甚至不需要-l
选项。当输出到非交互式终端(即文件或管道)时,ls
每个文件发出1行。您也可以使用-C1
选项强制它。您将获得3纳秒(至少:)不执行额外的stat
调用以获取不需要的日期,大小等。
答案 2 :(得分:2)
你会想做这样的事情:
if [[ $(ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l) == '1' ]]; then
# Something
fi
$(命令)语法捕获输出。我不确定平等比较是否正确,但根据这个stackoverflow它是。
答案 3 :(得分:1)
我希望" -l"检查文件是否存在不需要选项。我们也可以使用命令替换来获得相同的结果。
#!/bin/bash
if [ `ls -l $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz | wc -l` -eq 1 ];then
echo "One exists"
fi
答案 4 :(得分:1)
以前的答案没有提到的微妙之处:
if [ "$(ls -1d $INPUT_DIR/${INPUT_FILE_PREFIX}cons*.csv.gz 2>/dev/null | wc -l)" -eq 1 ]; then
echo 'Only 1 file';
fi
首次使用-1d
(一,dee)会做两件事:它不会扩展目录(如果你的目录名以.csv.gz结尾,出于某种奇怪的原因)并且只会显示每行1个条目,没有(总标题)标题或其他未输出的输出。将stderr重定向到/dev/null
将阻止ls: cannot access z*: No such file or directory
消息。
最后,您应该使用=
或-eq
,因为==
与zsh不兼容,如果使用单[
测试运算符(如果您关心bash / zsh)兼容性)。此外,BSD / OSX wc
会在输出中放置一些前导空格,因此您可能希望通过管道awk
去掉,以便进行比较。