我的脚本查找文件,grep模式,如果匹配,则将文件复制到目标文件夹。如您所见,我使用管道来做到这一点。 整个命令运行正常,但是我无法测试它,因为无论是否找到该文件,我都会得到相同的退出状态。 为了说明这一点,下面有两个例子。在第一个中,我找到了文件并grepped该文件。请注意打印的退出状态。 在第二个示例中,我没有找到并grepped该文件,但是退出状态是相同的。 如何正确测试此命令?
文件存在。
find $HOME -type f -name arq_*.txt | xargs -n1 -I{} grep -l 00819047 {} | xargs -n1 -I{} cp -v {} $HOME/aka
`/home/fabrifb/arq_144.txt' -> `/home/fabrifb/aka/arq_144.txt'
echo "0)${PIPESTATUS[0]} 1)${PIPESTATUS [1]} : 2)${PIPWSTATUS[2]} ?)$? @)${PIPESTATUS[@]}"
结果:
0)0 1)0 : 2) ?)0 @)0 0 0
它不存在
find $HOME -type f -name arqX_*.txt | xargs -n1 -I{} grep -l X00819047 {} | xargs -n1 -I{} cp -v {} $HOME/aka
echo "0)${PIPESTATUS[0]} 1)${PIPESTATUS [1]} : 2)${PIPWSTATUS[2]} ?)$? @)${PIPESTATUS[@]}"
结果
0)0 1)0 : 2) ?)0 @)0 0 0
我希望能够区分这两种情况,以便在文件不存在时向用户发出警告。
答案 0 :(得分:0)
find
如果找不到任何文件,则返回零。 grep
返回1,但是它从未收到任何文件名,因为它被包裹在xargs
中,对于空输入,它又返回0。如果要检查文件是否存在,可以使用数组:
shopt -s nullglob
files=(arq_*.txt)
if [[ "${#files[@]}" -eq 0 ]]
then
[handle non-existing files]
fi
for file in "${files[@]}"
do
if grep 00819047 "$file"
then
cp "$file" $HOME/aka
fi
done
或保护变量:
found=0
for file in arg_*.txt
do
found=1
[loop contents like above]
done
if [[ "$found" -eq 0 ]]
then
[handle non-existing files]
fi
您还遇到拼写错误PIPWSTATUS
。但是无论如何${PIPESTATUS[@]}"
都是您需要打印以获取该数组的完整内容的全部。
答案 1 :(得分:0)
除非有错误,否则find命令将返回0(成功),如果没有文件与您的参数匹配,find将不会返回错误。
如果成功处理所有文件,则以状态0退出查找,如果发生错误,则大于0退出。
您可能应该使用条件语句来检查是否找到了与模式匹配的文件。
if [ $(find $HOME -type f -name arq_*.txt) -gt 0 ]
then
echo "no matching file found"
else
echo "files found"
fi