如果我的文件夹中不存在该文件,我在获取代码以仅回显文本文件中的文件 ID 时遇到问题。
我有一个目录,其中的文件名为:
ASA11_mod_secun_2011.txt
ASB1133_mod_secun_2013.txt
BC09_mod_secun2_2011.txt
ASA111_mod_secun_2011.txt
以及ids.txt
ID,例如:
ASA11
ASB1133
BC09
ASA111
MK221
我的目录中缺少一个文件,但因为我正在处理数百个文件和数百个 ID,所以我只想回显该 ID,ids.txt
该 ID 不会作为文件名的一部分出现在当前目录中。我希望MK221
得到回应。
我尝试了 grep 和 for 循环的一些变体,并且得到了类似的结果,但我不断收到错误:
for i in $(cat ids.txt); do grep -v $i .; done
但这是打开我的目录中的每个文件,而不是仅仅打印$i
我的目录中没有出现的文件。
我认为 if then 语句可能就是我在这里需要的,但我什至无法正确地提出一个。任何帮助,将不胜感激!
像这样:
不要尝试使用“for”。使用 while 循环和 read 命令。
http://mywiki.wooledge.org/BashFAQ/001
compgen
使用返回 shell 代码来测试文件是否存在的完成情况是一个小技巧:help compgen
使用
awk
首先,让我们查找现有文件的 ID
ls -1 *_mod_*.txt | sed 's/_.*$//'
。如果我们要搜索子目录find -name '*_mod_*' | sed -e 's/^.*\///' -e 's/_.*$//'
。这里我们用来sed
从文件名中提取 id。然后使用
diff
命令比较结果:diff <(sort ids.txt) <(ls -1 *_mod_*.txt | sed 's/_.*$//' | sort)
或者
diff <(sort ids.txt) <(find -name '*_mod_*' | sed -e 's/^.*\///' -e 's/_.*$//' | sort)
您将得到以下结果: ids.txt 文件中存在但没有对应文件的 ID,以及 ids.txt 文件中有对应文件但不存在的 ID。
如果您只想要没有相应文件的 ID:
diff <(sort ids.txt) <(find -name '*_mod_*' | sed -e 's/^.*\///' -e 's/_.*$//' | sort) | grep -F '<'