我的目录中有许多文件以及其中的预期文件列表。
例如:我拥有的文件是:
- 文件1
- 文件2
- 文件3
预期的文件是
- 文件1
- 文件2
- 文件4
我想测试该目录并发现 file4 不在其中。
答案1
假设您有一个包含文件名的数组,并且想要找出目录中不存在哪些文件,只需循环遍历该数组,然后检查文件是否存在。 (-f
测试-e
任何类型的常规文件)
files=(file1 file2 file4)
for f in "${files[@]}" ; do
[ -f "$f" ] || echo "$f: not found"
done
反面类似,但是需要双循环或者将数组变成关联数组。使用双循环:
files=(file1 file2 file4)
for f in * ; do
found=0
for g in "${files[@]}" ; do
[ "$f" = "$g" ] && found=1
done
[ "$found" = 0 ] && echo "$f: in directory but not listed"
done
答案2
对于数组并集和减法,请查看zsh
而不是bash
.
$ expected=(file1 file2 file4)
$ existing=(file1 file2 file3) # or existing=(file*) to use globbing
$ echo missing: ${expected:|existing}
missing: file4
$ echo found: ${expected:*existing}
found: file1 file2
$ echo unexpected: ${existing:|expected}
unexpected: file3
助记符(至少是我的,不知道是不是官方的):
${A:|B}
: 要点$A
酒吧那些$B
${A:*B}
: 要点$A
主演那些$B
.
答案3
如果您必须测试一堆文件,那么函数是更好的解决方案。否则,一个简单ls
的文件就足够了!以下是当您要查找的文件不存在时您将得到的输出:
../theDirIWantToCheck $ ls theFileIWantToFind.txt
ls: theFileIWantToFind.txt: No such file or directory
我还建议使用制表符补全。发出ls
命令,然后开始键入您期望的任何文件的名称。您只需输入几个字符,然后按 Tab 键(如果不起作用,请按 Tab 键两次)。将显示与该模式匹配的所有文件名如果它们存在的话。
$ ls fi<tab>
file1.txt file2.txt file3.txt file_new.txt filetypes.txt
您还可以传递ls
多个参数来检查多个文件:
$ ls file1.txt file2.txt file3.txt
...
如果文件共享相同的模式前缀(例如上面的:file1、file2、file3),则可以使用大括号扩展。这就像以压缩形式传递所有三个参数。代表..
一个范围。
$ ls file{1..3}.txt
ls: file1.txt: No such file or directory
ls: file2.txt: No such file or directory
ls: file3.txt: No such file or directory
或者,您可以使用通配符来传递具有公共前缀“file”的所有可能的匹配模式(例如 file1.txt、file_other.txt):
$ ls file*
...
最后,您可以将数组中的所有参数传递给ls
并让它为您进行打印,而不是使用echo
.此外,如果您使用 选项-l
,ls
当文件确实存在时,您可以获得有关它们的一些额外详细信息,例如权限、文件大小和上次修改日期/时间。
答案4
perl -le '-e or print for qw/file1 file2 file4/'