Bash - 如何查找不在数组中的所有文件

Bash - 如何查找不在数组中的所有文件

我的目录中有许多文件以及其中的预期文件列表。

例如:我拥有的文件是:

  • 文件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.此外,如果您使用 选项-lls当文件确实存在时,您可以获得有关它们的一些额外详细信息,例如权限、文件大小和上次修改日期/时间。

答案4

perl -le '-e or print for qw/file1 file2 file4/'

相关内容