我相信以前在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个文件之间的内容比较。
答案 0 :(得分: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,可能会明确使用临时文件。
答案 1 :(得分:0)
感谢您的建议@jhnc。
在进行了更深入的考虑和讨论之后,我意识到我什至不需要进行这种比较。下载文件后,我只需要提供成功下载的列表。然后,我可以根据成功下载列表从服务器中删除。
但是,我仍然很想知道如何与'\r \n'
与'\n'
行结束情况进行比较