[英]How can I find similar files within two directories in Linux
我有一个任务如下:
循环遍历 ~files 中的每个文件,检查 ~oUser/files 中是否存在相同的文件,如果存在,则将 oUser 中的文件移动到 .bkp。 确保文件不存在后,将文件从主目录复制到 oUser 的主目录。
我很难理解这个问题,但我开始一步一步地分解它,我无法理解如何找到公共文件。
这是我到目前为止所做的:
cd files
touch t1.txt
touch t2.txt
touch t3.txt
cd ~oUser/files
touch t2.txt
touch t4.txt
所以我学会了循环是:
for FILE in ~/files; do echo $FILE; done
for FILE in ~/oUser/files; do echo $FILE; done
我以为我可以将名称输出到特定文件中,然后使用 grep 来表示共性
find ~/files -type f > files.txt
find ~oUser/files -type f > oUserfiles.txt
grep -l files.txt oUserfiles.txt > file.txt
但是当我打开file.txt
它是空的。
我不会为你写作业,但这里有一些你可能会觉得有用的信息。
找
find
打印它找到的以您提供的路径开头的文件。 因此,如果您在~/files/
有文件example.txt
,这将通过find ~/files -type f
作为$HOME/files/example.txt
打印。 这意味着如果您在不同的文件夹中运行find
,输出将不匹配,因此即使grep
按照您解释的方式工作(即匹配文件中的行),它仍然无法工作,因为路径不同。
格雷普
grep
期望输入的形式
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
如其手册页中所述。 -l
标志将grep
的行为更改为仅打印匹配的文件的名称,因此grep -l files.txt oUserfiles.txt
仅检查oUserfiles.txt
中的任何行oUserfiles.txt
与文字字符串files.txt
匹配,如果匹配,则它输出文字字符串oUserfiles.txt
。 我建议阅读该手册页,但我会注意到-f
标志从第一个文件中逐行提取模式,如果您仍然想这样做的话。`
检查文件存在
您可以使用[ -e path/to/file.txt ]
检查特定文件是否存在。 那里的空格很重要,所以不要省略它们。 为了检查 ~ 并使用变量,您需要类似于[ -e ~/files/"$FILE" ]
,它允许 bash 将~
扩展到$HOME
(感谢@Cyrus! )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.