在 Bash 中,给定一系列文件 File.Number.{1..100}.txt,如何判断给定目录中不存在哪些文件

在 Bash 中,给定一系列文件 File.Number.{1..100}.txt,如何判断给定目录中不存在哪些文件

我有一系列文件,如下所示:

File.Number.{1..10}.txt

我想获取其中存在哪些文件的数组或序列。一种乏味的方法是循环所有这些并附加到数组中。我想知道是否有一个行可以告诉我哪些文件不存在或提取文件的编号。

答案1

(您的问题在一个地方说“确实存在的文件”,在另一个地方说“不存在的文件”,所以我不确定您想要哪一个。)

为了得到那些如果存在,您可以在 Bash 中使用扩展的 glob:

$ shopt -s nullglob
$ echo File.Number.@([1-9]|10).txt
File.Number.10.txt File.Number.1.txt File.Number.7.txt File.Number.9.txt

启用shopt -s nullglobbash 的nullglob选项,以便如果没有与 glob 匹配的文件,则不会返回任何内容。没有它,没有匹配项的 glob 将扩展到自身。

或者,更简单地说,Zsh 中的数字范围:

% echo File.Number.<1-10>.txt
File.Number.10.txt File.Number.1.txt File.Number.7.txt File.Number.9.txt

循环也不是那么糟糕,并且有助于查找需要的文件不要比 glob 更好地存在:

$ a=(); for f in File.Number.{1..10}.txt; do [ -f "$f" ] || a+=("$f"); done
$ echo "these ${#a[@]} files didn't exist: ${a[@]}"
these 6 files didn't exist: File.Number.2.txt File.Number.3.txt File.Number.4.txt File.Number.5.txt File.Number.6.txt File.Number.8.txt

答案2

只需使用ls File.Number.{1..10}.txt >/dev/null

下面的例子。

$ ls
File.Number.1.txt  File.Number.3.txt
$ ls File.Number.{1..10}.txt >/dev/null
ls: cannot access 'File.Number.2.txt': No such file or directory
ls: cannot access 'File.Number.4.txt': No such file or directory
ls: cannot access 'File.Number.5.txt': No such file or directory
ls: cannot access 'File.Number.6.txt': No such file or directory
ls: cannot access 'File.Number.7.txt': No such file or directory
ls: cannot access 'File.Number.8.txt': No such file or directory
ls: cannot access 'File.Number.9.txt': No such file or directory
ls: cannot access 'File.Number.10.txt': No such file or directory
$

答案3

在 中zsh,要将列表减少为引用给定目录中现有条目的元素,您可以执行以下操作:

dir=/some/dir
list=(File.Number.{1..10}.txt other-file-{a,b}.txt)

existing_in_dir=($dir/$^list(N:t))
non_existing=(${list:|existing_in_dir})

答案4

cd /tmp

base=foo
number=42

touch $base.$number.{3,6}.txt

for f in $base.$number.{1..10}.txt
do
  [ -f $f ] || echo $f
done

rm $base.$number.{3,6}.txt

$base如果或中有特殊字符,则需要更加小心$number

相关内容