unix 比较文件名列表

unix compare lists of file names

我相信之前在 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 命令,但我似乎无法破解代码。我希望有很多方法可以完成这项任务。有什么建议或工作参考吗?

我的麻烦其实不是循环本身,而是比较两个文件之间的内容。

感谢@jhnc 的建议。

在对此进行更深入的考虑和交谈之后,我意识到我什至不需要进行这种比较。下载文件后,我只需要生成成功下载的列表。然后我可以根据成功下载的列表从服务器上删除。

但是,我仍然有兴趣知道如何比较 '\r \n''\n' 行尾情况

comm -1 -2 file1 file2 returns 只是两个文件中相同的行。这可以用作 sftp.

的批处理命令文件的基础

从问题的评论来看,这两个文件似乎 line-endings 不同。这可以通过多种方式解决,最简单的可能是 trcomm- 理解为文件名,意思是 "read from stdin"。

例如:

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

如果文件 1 或文件 2 未排序,必须更正此问题 comm 才能正常运行。对于 bash,这可能是:

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

对于不理解 <( ... ) 语法的 shell,可能会显式使用临时文件。