Как делают меня djvubind только файлы, в которых находятся ls | grep -P "page\\d\\d\\d.tif"
?
Поспешные читатели могут пропустить вниз к Соединению Всего и читать просто, что раздел - но для пользователей, плохо знакомых с темой, я предлагаю запуститься с начала.
Выполнение djvubind
таким образом, это только использует названные файлы pageNNN.tif
(где каждый N
некоторая цифра), находится одним способом, значительно более сложным, чем Вы могли бы думать, в то время как в другом отношении немного менее сложно.
Передача названий просто желаемого .tif
файлы к djvubind
команда не будет работать, потому что djvubind
берет каталог в качестве его аргумента и настаивает на том, чтобы пытаться использовать все файлы, непосредственно содержавшиеся в том каталоге.
Один способ обойти это состоит в том, чтобы создать другой каталог жестких ссылок, указывающих на файлы в каталоге, с которого Вы запустили, работая djvubind
на том каталоге, затем (дополнительно) удаляя его. Я представлю ту методику в этом ответе.
Обычно, для этого вида вещи, символьные ссылки были бы предпочтены жестким ссылкам. Однако djvubind
по-видимому, перескакивает через символьные ссылки автоматически, отказываясь обрабатывать файлы, на которые они указывают. (Кажется, нет никакой опции изменить это поведение, но если кто-то знает о пути, мне - или они - могут отредактировать этот ответ.)
Но это менее сложно в этом, Вы не должны вызывать ls
или даже grep
.
За исключением некоторых редких ситуаций, где единственная цель состоит в том, чтобы показать список каталогов пользователю, обычно лучше постараться не анализировать вывод ls
. И в то время как grep
конечно, может использоваться с этой целью, Ваш подход имеет недостаток выбора некоторых файлов с очень отличающимися именами, как rampage999.tiffany's.revenge.mp3
. (Вы могли зафиксировать это путем передачи grep
-x
флаг, но действительно Вам не нужно grep
вообще для этого.)
Существует два особенно популярных метода для выбора файлов, которые соответствуют конкретному шаблону:
Я буду использовать первый путь в этом руководстве и показывать команды для второго пути в конце.
Во-первых, я предлагаю сочинить и испытать команду только для показа названий файлов, на которые мы хотим воздействовать. Это должно помочь избежать ошибок - Вы будете видеть, выбираете ли Вы файлы правильно или нет. Чтобы сделать это, можно работать printf '%s\n' filename
для каждого. (Для реальной вещи Вы замените printf '%s\n'
с другой командой.)
for x in page[0-9][0-9][0-9].tif; do printf '%s\n' "$x"; done
Обратите внимание что шарик (page[0-9][0-9][0-9].tif
) закрывается кавычки, поскольку оболочка должна развернуть его, затем цикл через расширенный список. (Тестирование будет выглядеть примерно так, хотя Ваш вывод будет дольше, если у Вас будет много файлов. Необходимо смочь видеть, как только корректные файлы выбраны.)
Теперь для реальной вещи. Сделайте каталог для хранения жестких ссылок:
mkdir page-links
Заполните новый каталог с жесткими ссылками на желаемые файлы:
for x in page[0-9][0-9][0-9].tif; do ln "$x" "page-links/$x"; done
Выполненный djvubind
на недавно заполненном page-links
каталог:
djvubind page-links
Дополнительно, удалите каталог жестких ссылок:
rm -r page-links
Это будет выглядеть примерно так.
find
...Использовать find
вместо оболочки globbing и для цикла:
-mindepth 1
препятствовать тому, чтобы содержание каталога было рассмотрено как возможное соответствие,-maxdepth 1
так, чтобы только файлы, непосредственно содержавшиеся в текущем каталоге (не те, которые в его подкаталогах), были подобраны, иfind
команда (который затем выполняет соответствие).Перечислите файлы:
find . -mindepth 1 -maxdepth 1 -name 'page[0-9][0-9][0-9].tif'
Не указывая действия, значения по умолчанию -print
действие используется, перечисляя файлы, которые Вы выбрали. Результатами будут предшествовать ./
, но это не вызовет проблем здесь.
После создания целевого каталога (mkdir page-links
), заполните его:
find . -mindepth 1 -maxdepth 1 -name 'page[0-9][0-9][0-9].tif' -exec ln {} page-links/{} \;
Вы не должны заключать в кавычки {}
, хотя некоторым людям нравится делать так, потому что это разъясняется (людям), что это не расширение фигурной скобки, и возможно необходимо сделать так при вызове find
от некоторых оболочек non-Bourne-style, если они используют другой синтаксис расширения фигурной скобки. Обратите внимание на это, заключаете ли Вы его в кавычки, find
будет вести себя то же - включая для файлов с пробелами на их имена. (find
никогда не видит кавычки, когда они удалены оболочкой прежде find
выполнения. Неправильное представление то заключение в кавычки {}
имеет некоторое отношение к пути find
-exec
имена файлов передач действия к командам - то, почему я не заключаю его в кавычки.)
После этого, выполнение djvubind
(и дополнительно удаление page-links
каталог впоследствии), будет, конечно, работать точно тот же путь.