运行时参数如下:$1
是包含文件列表的文件的路径
$2
是包含文件的目录的路径
我想要做的是检查$1
目录中列出的$2
中列出的每个文件
我在想:
for f in 'cat $1'
do
if (FILEEXISTSIN$2DIRECTORY)
then echo '$f exists in $2'
else echo '$f is missing in $2' sleep 5 exit
fi
done
正如您所看到的,我希望它能够在$1
目录中不存在$2
中列出的任何文件时,脚本会对此进行说明然后关闭。我无法理解的唯一部分是(FILEEXISTSIN $ 2DIRECTORY)部分。我知道您可以[ -e $f ]
,但我不知道如何确保它检查它是否存在于$ 2目录中。
编辑:进一步思考,也许我可以使用嵌套for循环?
答案 0 :(得分:2)
如果您指定的输入文件包含要检查的以换行符分隔的文件列表,则以下解决方案(使用while读取循环)足够强大,可以正确处理带空格的文件名。
通常,您不应该使用for i in $(command)
形式的循环,而是选择while循环。有关详细信息,请参阅http://mywiki.wooledge.org/DontReadLinesWithFor。
while read -r file; do
if [[ -e "$2/$file" ]]; then
echo "$f exists in $2"
else
echo "$f does not exist in $2"
sleep 5
exit 1
fi
done < "$1"
答案 1 :(得分:0)
由于您正在处理名称中没有空格的文件名列表(因为$(cat $1)
表示法会将内容分开),所以它相对简单:
for file in $(cat $1)
do
if [ -e "$2/$file" ]
then echo "$file exists in $2"
else echo "$file is missing in $2"; sleep 5; exit 1
fi
done
基本上,使用内置的字符串连接工具来构建文件的完整路径,并使用test
或[
运算符来检查文件是否存在。
如果必须处理任意文件名,则会出现复杂性,特别是如果任意文件名中的任意一个字符可能是换行符。可以说,它们使问题充分复杂化,除非你说你需要处理它,否则我不会处理它,即便如此,我还会就是否需要处理名称中的换行进行协商。双引号变量扩展是处理它的策略的关键部分。问题的另一部分是如何准确地将文件名转换为变量。