【发布时间】:2016-01-05 20:04:07
【问题描述】:
我有一个包含文件列表的文本文件a.txt:
photo/a.jpg
photo/b.jpg
photo/c.jpg
etc
我想获取不存在的文件列表。
【问题讨论】:
-
oneliner
xargs -n1 -I{} bash -c "[[ ! -e {} ]] && echo {}" < a.txt > b.txt.
我有一个包含文件列表的文本文件a.txt:
photo/a.jpg
photo/b.jpg
photo/c.jpg
etc
我想获取不存在的文件列表。
【问题讨论】:
xargs -n1 -I{} bash -c "[[ ! -e {} ]] && echo {}" < a.txt > b.txt.
你可以使用:
xargs -I % bash -c '[[ ! -e $1 ]] && echo "$1"' _ % < a.txt > b.txt
xargs 将为a.txt 中的每一行运行bash -c。 [[ ! -e $1 ]] 将检查每个条目是否存在。
【讨论】:
> b.txt,对吧?
cat a.txt | xargs -I % bash -c '[[ ! -e $1 ]] && echo "$1"' _ % > b.txt
_ 是什么意思?
bash -c 和_ 用于仅在$0 中传递_。也可以是cat a.txt | xargs -I % bash -c '[[ ! -e $1 ]] && echo "$1"' '' %。
cat a.txt | xargs -I % bash -c '[[ ! -e $0 ]] && echo "$0"' % 也在工作。但感谢您指出使用$0 时未设置$0 的事实@!
无需涉及cat,或为文件中的每一行调用单独的shell;一个简单的while read 循环就足够了:
while read -r file
do
[ -e "$file" ] || echo "$file"
done < a.txt
逐行阅读。测试每个文件是否存在,如果不存在则打印其名称。
就像使用< 将输入传递给循环一样,可以使用> out.txt 将循环的输出写入文件。
【讨论】: