Bash에서 일련의 파일 File.Number.{1..100}.txt가 주어지면 주어진 디렉토리에 어떤 파일이 존재하지 않는지 확인하는 방법

Bash에서 일련의 파일 File.Number.{1..100}.txt가 주어지면 주어진 디렉토리에 어떤 파일이 존재하지 않는지 확인하는 방법

다음과 같은 일련의 파일이 있습니다.

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

나는 그 안에 존재하는 파일의 배열이나 시퀀스를 얻고 싶습니다. 지루한 접근 방식은 모든 항목을 반복하여 배열에 추가하는 것입니다. 어떤 파일이 존재하지 않는지 알려주거나 파일 번호를 추출할 수 있는 줄이 있는지 궁금합니다.

답변1

(귀하의 질문에 한 곳에서는 "존재하는 파일"이라고 되어 있고 다른 곳에서는 "존재하지 않는 파일"이라고 되어 있어서 어느 쪽을 원하는지 잘 모르겠습니다.)

그것들을 얻기 위해서하다있는 경우 Bash에서 확장 글로브를 사용할 수 있습니다.

$ 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

glob과 일치하는 파일이 없으면 아무것도 반환되지 않도록 shopt -s nullglobbash에 대한 옵션을 활성화합니다 . nullglob이것이 없으면 일치 항목이 없는 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.

관련 정보