Unix比较文件名列表

时间:2019-06-19 21:10:22

标签: unix while-loop compare sftp exists

我相信以前在SO上已经回答过类似的问题。尽管我确信许多其他人都遇到过这种情况,但我找不到适合我的情况的任何东西。

在Red Hat上的FTP会话中,我产生了当前驻留在服务器上的文件名列表。该列表包含文件名,仅包含文件名。将此文件称为1。也许它包含以下内容:

513569430_EDIP000754535900_MFC_20190618032554.txt
blah.txt
duh.txt

然后,我已经下载了文件,并生成了成功下载文件的列表。同样,此列表包含文件名,仅包含文件名。将此文件命名为2。也许它包含以下内容:

loadFile.dat
513569430_EDIP000754535900_MFC_20190618032554.txt
localoutfile.log

现在,我想遍历file1中的名称,并检查它们是否存在于file2中。如果存在,我将返回FTP服务器并从服务器删除文件。

我看过while循环以及comm和test命令,但是我似乎无法破解代码。我希望有很多方法可以完成此任务。有任何建议或参考资料吗?

我遇到的麻烦实际上不是循环本身,而是2个文件之间的内容比较。

2 个答案:

答案 0 :(得分:2)

comm -1 -2 file1 file2仅返回两个文件中相同的行。可用作sftp批处理命令文件的基础。

从注释到问题,两个文件的行尾似乎有所不同。可以通过多种方式解决此问题,最简单的方法可能是使用trcomm-理解为一个文件名,意为“从标准输入中读取”。

例如:

tr -d '\r` file1 | comm -1 -2 - file2

如果未对file1或file2进行排序,则必须更正comm才能使其正常运行。使用bash,可能是:

comm -1 -2 <( sort file1 | tr -d '\r' ) <( sort file2 )

对于不了解<( ... )语法的shell,可能会明确使用临时文件。

答案 1 :(得分:0)

感谢您的建议@jhnc。

在进行了更深入的考虑和讨论之后,我意识到我什至不需要进行这种比较。下载文件后,我只需要提供成功下载的列表。然后,我可以根据成功下载列表从服务器中删除。

但是,我仍然很想知道如何与'\r \n''\n'行结束情况进行比较