Как делают меня djvubind на результате grep и ls?

Как делают меня djvubind только файлы, в которых находятся ls | grep -P "page\\d\\d\\d.tif"?

1
задан 16 August 2014 в 18:26

1 ответ

Поспешные читатели могут пропустить вниз к Соединению Всего и читать просто, что раздел - но для пользователей, плохо знакомых с темой, я предлагаю запуститься с начала.

Основные принципы

Выполнение djvubind таким образом, это только использует названные файлы pageNNN.tif (где каждый N некоторая цифра), находится одним способом, значительно более сложным, чем Вы могли бы думать, в то время как в другом отношении немного менее сложно.

  • Передача названий просто желаемого .tif файлы к djvubind команда не будет работать, потому что djvubind берет каталог в качестве его аргумента и настаивает на том, чтобы пытаться использовать все файлы, непосредственно содержавшиеся в том каталоге.

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

    Обычно, для этого вида вещи, символьные ссылки были бы предпочтены жестким ссылкам. Однако djvubind по-видимому, перескакивает через символьные ссылки автоматически, отказываясь обрабатывать файлы, на которые они указывают. (Кажется, нет никакой опции изменить это поведение, но если кто-то знает о пути, мне - или они - могут отредактировать этот ответ.)

  • Но это менее сложно в этом, Вы не должны вызывать ls или даже grep.

    За исключением некоторых редких ситуаций, где единственная цель состоит в том, чтобы показать список каталогов пользователю, обычно лучше постараться не анализировать вывод ls. И в то время как grep конечно, может использоваться с этой целью, Ваш подход имеет недостаток выбора некоторых файлов с очень отличающимися именами, как rampage999.tiffany's.revenge.mp3. (Вы могли зафиксировать это путем передачи grep -x флаг, но действительно Вам не нужно grep вообще для этого.)

Выбор желаемых файлов

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

  1. окружите globbing и для цикла
  2. find команда (который принимает подобный globbing синтаксис),

Я буду использовать первый путь в этом руководстве и показывать команды для второго пути в конце.

Во-первых, я предлагаю сочинить и испытать команду только для показа названий файлов, на которые мы хотим воздействовать. Это должно помочь избежать ошибок - Вы будете видеть, выбираете ли Вы файлы правильно или нет. Чтобы сделать это, можно работать 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 каталог впоследствии), будет, конечно, работать точно тот же путь.

2
ответ дан 7 December 2019 в 14:07

Другие вопросы по тегам:

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