unix 比较文件名列表

Posted

技术标签:

【中文标题】unix 比较文件名列表【英文标题】:unix compare lists of file names 【发布时间】:2019-06-19 21:10:22 【问题描述】:

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

我的问题不是循环本身,而是两个文件之间的内容比较。

【问题讨论】:

sort file1 file1 file2 | uniq -c | sed '/^ *3 /!d;s///;s/[^A-Za-z0-9]/\\&/g;s/^/rm /' > sftp-batch-cmds bash: comm -1 -2 <(sort file1) <(sort file2) | ... 所有帐户的 comm -12 file1 file2' 应该给我匹配的 1 条记录,但它什么也不返回。 可能是行尾(\r\n vs \n vs \r)差异。尝试使用grep 513569430_EDIP000754535900_MFC_20190618032554 file? | od -c查看 正确。 file1 以 \r \n 结尾,而 file2 仅以 \n 结尾。关于处理这个问题的任何热门提示? 【参考方案1】:

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

从 cmets 到问题,这两个文件的行尾似乎不同。这可以通过多种方式解决,最简单的可能是trcomm- 理解为表示“从标准输入读取”的文件名。

例如:

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

如果 file1 或 file2 未排序,则必须更正此问题,comm 才能正常运行。使用 bash,这可能是:

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

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

【讨论】:

完美。谢谢你的解释。【参考方案2】:

感谢@jhnc 的建议。

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

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

【讨论】:

以上是关于unix 比较文件名列表的主要内容,如果未能解决你的问题,请参考以下文章

beyond compare 比较两个文件,一个文件是UNIX,一个是window的,文本内容一样,怎么比较

如何比较 2 个文件夹在 Unix 上的权限?

在UNIX shell编程里如何比较两个文件哪个修改的时间晚些!急谢谢!

如何理解 Unix/Linux 的文件系统?

请问,unix中ls命令如何显示文件以GB为单位的大小

Python3标准库:fnmatch UNIX式glob模式匹配