В Bash, учитывая последовательность файлов File.Number.{1..100}.txt, как я могу определить, какие из них не существуют в данном каталоге

pdftk К сожалению, больше не является открытым исходным кодом. (Это долгая история.)

Обычный gs двигатель может это сделать, хотя:

  gs -sDEVICE=pdfwrite     \
     -sPageList=odd         \
     -sOutputFile=odd.pdf   \
     -dBATCH -dNOPAUSE      \
     file.pdf 

Затем замените «нечетные» на «четные», чтобы выбрать четные страницы.

5
17.05.2020, 17:49
3 ответа

(В вашем вопросе сказано, что «файлы, которые существуют» в одном месте, и «файлы, которых нет» в другом, поэтому я не был уверен, какой из них вам нужен.)

Чтобы получить те, которые действительно существуют, вы можете использовать расширенный glob в 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

Параметр shopt -s nullglobвключает параметр bash nullglob, чтобы ничего не возвращалось, если нет файлов, соответствующих шаблону. Без него шарик без совпадений расширяется до самого себя.

Или, проще говоря, числовой диапазон в Zsh:

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

Цикл тоже не так уж и плох, и позволяет находить файлы, которые не не существуют, намного лучше, чем глобус:

$ 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
13
28.04.2021, 23:13

В 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})
3
28.04.2021, 23:13

Список существующих файлов представляет собой просто расширение глобуса:

var=$( printf '%s\n' File.Number.[0-9].txt File.Number.[0-9][0-9].txt )

Список несуществующих становится немного длиннее, в bash:

comm -13 <(echo "$var" | sort) <(printf '%s\n' File.Number.{1..10}.txt | sort)

Это будет работать, если имена файлов не содержат символов новой строки.

Первая часть просто перечисляет имена файлов в pwd, которые содержат одну или две цифры между File.Number.и .txt

.

Вторая часть просто воссоздает полный список искомых файлов.

Команда comm -13даст дополнение списка 1 в списке 2 (элементов в наборе 1, которых нет в наборе 2 ).

3
28.04.2021, 23:13

Теги

Похожие вопросы