【问题标题】:How to make a list of files that don't exist from a list of files如何从文件列表中创建不存在的文件列表
【发布时间】: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.

标签: linux bash shell sh


【解决方案1】:

你可以使用:

xargs -I % bash -c '[[ ! -e $1 ]] && echo "$1"' _ % < a.txt > b.txt

xargs 将为a.txt 中的每一行运行bash -c[[ ! -e $1 ]] 将检查每个条目是否存在。

【讨论】:

  • 太棒了,谢谢。然后把它放到一个文件中(因为我要检查 40k 个文件并且输出会很长),我只需要在该命令上附加 &gt; b.txt,对吧?
  • 是的,没错,cat a.txt | xargs -I % bash -c '[[ ! -e $1 ]] &amp;&amp; echo "$1"' _ % &gt; b.txt
  • _ 是什么意思?
  • 这用于将参数传递给bash -c_ 用于仅在$0 中传递_。也可以是cat a.txt | xargs -I % bash -c '[[ ! -e $1 ]] &amp;&amp; echo "$1"' '' %
  • 啊,明白了!我发现cat a.txt | xargs -I % bash -c '[[ ! -e $0 ]] &amp;&amp; echo "$0"' % 也在工作。但感谢您指出使用$0 时未设置$0 的事实@!
【解决方案2】:

无需涉及cat,或为文件中的每一行调用单独的shell;一个简单的while read 循环就足够了:

while read -r file
do
    [ -e "$file" ] || echo "$file"
done < a.txt

逐行阅读。测试每个文件是否存在,如果不存在则打印其名称。

就像使用&lt; 将输入传递给循环一样,可以使用&gt; out.txt 将循环的输出写入文件。

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多