Допустим, я хотел подстановочные знаки каталогов, а затем подстановочный знак всех файлов в этих каталогах.
Как бы я это сделал?
Я знаю *, это подстановочные знаки для всех файлов, но я не знаю, как подстановочные знаки для каталогов.
Например, pdf2djvu -o /dir/[wildcard dirs]/[wildcards.djvu] /dir/[wildcard dirs]/[wildcards.pdf]
,
. На вторичной ноте можно повлиять на такой подстановочный знак, если в расположении есть пробел, в котором, как правило, вводится «» для пробелов, лучше использовать \ - это время?
Я попробовал то, что выложил выше, используя стандарт * для файлов шаблонов и файлов шаблонов, таких как /dir[entire dir had no spaces]/*/*.djvu
, но получил следующую ошибку
I/O error (basic_ios::clear)
Одно возможное обходное решение должно использовать somethig как:
find . -iname *.pdf | xargs -I% pdf2djvu -o % %.djvu
Это нашло бы все файлы PDF, запускающиеся в текущем каталоге (рекурсивными) и выполнять команду pdf2djvu для создания file.pdf.djvu файлов.
Проблема нет никакого хорошего способа сохранить два подстановочных расширения в синхронизации и выполнить итерации по ним, как Вы желаете сделать. Так как Вы только хотите сделать это на одном файле за один раз, было бы легче просто использовать, находят. Если бы Вы хотите рекурсивно сделать это, я сделал бы find . -iname '*.pdf' -exec pdf3djvu -o '{}'.djvu '{}' \;
, Если у Вас есть только определенные каталоги, Вы хотите выполнить в этом, придумать подстановочный знак оболочки, который расширяется до тех каталогов, и используйте это в качестве аргумента для нахождения вместо .
. Например, если у Вас есть несколько каталогов, которые заканчиваются "djvus" (как "pie_djvus" и "flag_djvus"):
find ./*djvus/ -maxdepth 1 -iname '*.pdf' -exec pdf3djvu -o '{}'.djvu '{}' \;
Используя /
после того, как шарик гарантирует, что шарик будет только соответствовать каталогам и определению, что maxdepth 1 гарантирует, что находка не пойдет больше чем один уровень глубоко в указанных каталогах (который является верхним уровнем)
В обоих случаях, Вы собираетесь закончить с вещами как "file.pdf.djvu", который может или не может быть раздражающим Вам. Таким образом, будет второй шаг последующей обработки, необходимый, если Вы использовали, находят. Вот один способ сделать это, если Вы будете использовать недавний удар в качестве своей оболочки (то некоторые оболочки разделят имена файлов на пробелах, которые повредят это - но текущий удар не делает).
for F in *.pdf.djvu; do mv -v "$F" "${F%.pdf.djvu}.djvu"; done