我有一系列文件,如下所示:
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 nullglob
bash 的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
。