如何将 mdfind 输出重定向到 bash 中的 if else 语句

如何将 mdfind 输出重定向到 bash 中的 if else 语句

我正在尝试创建一个脚本,在整个计算机上查找输入文件中列出的一些文件,然后将这些文件复制到特定文件夹中。到目前为止,使用 for 循环和 mdfind“命令”一切正常 | xargs。但是如果我添加一个 if 语句来创建一个输出文件,其中包含 mdfind 未找到的文件列表,那么问题就来了。这是我的实际代码:

if [ $# -eq 0 ]
then
echo "Please introduce the name of the input file after runnig the command. 
For this script you need an INPUT.txt file containing only the list of the 
samples you want to copy." 
else
for i in $(cat $1); 
do mdfind "kMDItemDisplayName == $i*.ab1" | xargs -I '{}' cp '{}' 
/Users/xxxxx/xxxxx/xxxxx/xxxxxxx/test_moving/; 
if [ $? -eq 0 ] 
then
echo $i >> extractions_not_found.txt
else
echo $i >> extractions_found.txt
fi
done
fi

我正在使用 $?重定向输出

 mdfind "kMDItemDisplayName == $i*.ab1" | xargs -I '{}' cp '{}' /Users/xxxxx/xxxxx/xxxxx/xxxxxxx/test_moving/;

但它始终 = 0,即使它无法找到输入文件中列出的一个文件。

任何人都可以帮助我理解错误在哪里?

谢谢你!

答案1

运行后mdfind ... | xargs cp ..., 中的错误代码$?是 的错误代码xargs,因为它是管道中的最后一个命令。xargs如果执行的任何命令失败,则返回 123,但如果mdfind不产生任何输出,则不xargs执行任何操作,因此它也不会失败。

但是,在 Bash 中,您可以在最后一个管道中找到所有命令的退出代码数组变量 PIPESTATUS。第一个命令的退出代码是${PIPESTATUS[0]}等。

$ false | true | xargs false
$ echo "${PIPESTATUS[*]}"
1 0 123

因此,您可以使用$?为您提供退出状态的方法,而不是使用为您提供退出状态的。或者将批次保存到另一个变量并测试两者。 ( )xargs${PIPESTATUS[0]}mdfindsaved=("${PIPESTATUS[@]}")

或者,使用set -o pipefail以便为$?您提供管道最后一个失败命令的退出代码(如果其中任何一个命令失败)。 (false | true将导致$?=1。)

相关内容