我有一个作业如下:
遍历 ~files 中的每个文件,检查 ~oUser/files,如果有,则将 oUser 中的文件移动到 .bkp。 一旦你确保文件不存在,从你的 主目录到 o用户的主目录。
我很难理解这个问题,但我开始一步一步地分解它,我无法理解如何找到常见文件。
这是我到目前为止所做的:
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
打印它找到的文件,这些文件以您为其提供的路径开头。因此,如果您将文件example.txt
在~/files/
中,这将由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
中的任何行是否与文字字符串files.txt
匹配,如果是,则输出文字字符串oUserfiles.txt
。我建议阅读该手册页,但我会注意到,如果您仍然想这样做,-f
标志会从第一个文件中逐行拉取模式。
检查文件是否存在
您可以使用[ -e path/to/file.txt ]
检查特定文件是否存在。那里的空间很重要,所以不要省略它们。为了签入 ~,并使用变量,您需要类似[ -e ~/files/"$FILE" ]
的东西,这允许 bash 将~
扩展到$HOME
(感谢 @Cyrus!