我相信类似的问题以前在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服务器并从服务器中删除文件。
我已经查看了循环,通信和测试命令,但我似乎无法破解代码。 我希望有很多方法可以完成这项任务。 有什么建议或工作参考吗?
我的麻烦领域实际上不是循环本身,而是 2 个文件之间的内容比较。
comm -1 -2 file1 file2
只返回两个文件中相同的行。这可以用作sftp
的批处理命令文件的基础。
从评论到问题,这两个文件的行尾似乎不同。这可以通过多种方式解决,最简单的可能是tr
.comm
将-
理解为文件名,意思是"从标准输入读取"。
例如:
tr -d 'r` file1 | comm -1 -2 - file2
如果未对 file1 或 file2 进行排序,则必须更正此问题才能使comm
正常运行。使用 bash 时,这可能是:
comm -1 -2 <( sort file1 | tr -d 'r' ) <( sort file2 )
对于不理解<( ... )
语法的 shell,可以显式使用临时文件。
感谢您@jhnc的建议。
在对此进行了更深入的考虑和对话之后,我意识到我甚至不需要做这种比较。 下载文件后,我只需要生成成功下载的列表。 然后,我可以根据成功下载的列表从服务器中删除。
但是,我仍然有兴趣知道如何与'r n'
与'n'
行结束情况进行比较