Использование find, xargs и т. Д. Для вывода файлов с одинаковыми именами

839
75th Trombone

У меня есть папка, полная файлов HTML:

001.htm 002.htm 003.htm … 

Я хочу запустить Pandoc на них, чтобы преобразовать их в файлы Markdown с одинаковыми именами:

001.md 002.md 003.md 

Эта команда работает на одном из них:

pandoc -f html -t markdown 001.htm -o 001.md 

И я хочу использовать findи xargsавтоматически запускать аналогичную команду для каждого файла в папке.

Я дошел до этого:

find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {} 

… Который усекает каждый файл в каталоге, так что теперь я спрашиваю, прежде чем что- то сломать.

Что не так с моей командой выше, и / или каков совершенно другой / более эффективный способ сделать это?

2

3 ответа на вопрос

3
Martín Canaval

Мне удалось сделать это с этим 1 вкладышем. Если вы гибки в отношении xargsи findчасти.

for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "$.md"; done 

Если вы хотите действовать рекурсивно (так: все .htmфайлы в текущем каталоге и все подкаталоги), то (при условии bash 4+) вы можете использовать параметр globstarоболочки:

shopt -s globstar for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "$.md"; done 
+1. xargs не дает вам такой же гибкости при изменении имени файла. ** не ** не заменяйте `* .htm` на` $ (find ...) `- имена файлов с пробелами будут правильно обрабатываться в первом случае, но * не * во втором. glenn jackman 11 лет назад 2
@glennjackman Если вы не установите для bash `$ IFS` значение` $ '\ n'` для этого раздела кода, в этом случае пробелы не являются проблемой - хотя новые строки все же есть. Daniel Beck 11 лет назад 1
Вау, в командной строке есть две или три новые вещи, которые я могу извлечь из этого фрагмента. Спасибо! 75th Trombone 11 лет назад 0
3
Daniel Beck

Использование {}не достаточно гибко для некоторых ситуаций. Похоже, это один из тех.

Возможный обходной путь будет для -execсценария find, например, так:

find . -name '*.htm' -exec ./convert-to-md.sh {} \; 

Файл сценария должен выглядеть примерно так, в зависимости от конкретной pandocкомандной строки:

#!/bin/bash pandoc -f html -t markdown -o "$" "$" 

Если вы не хотите создавать и сохранять для этого файл скрипта, вы всегда можете вставить bashкод скрипта:

find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "$" "$"' - 

Дополнительный -в конце служит для заполнения $0bash, который обычно включает имя сценария оболочки, позиционные аргументы начинаются с $0.

Это позволяет продолжать использовать find(даже -print0и xargs -0если вы обработки странных имен файлов), но не требует создания отдельного файла.

Разве `find` не обрабатывает странные имена файлов в любом случае? IIRC никогда не было веской причины использовать `find… -print0 | xargs -0… ` slhck 11 лет назад 0
@slhck Новые строки являются допустимыми компонентами имени файла. Ниже показано, как это приводит к сбою сценариев: `touch" $ (echo -e 'foo \ nbar') "; находить . имя 'foo * bar' | xargs -n 1 echo File: ` Daniel Beck 11 лет назад 0
1
glenn jackman

Вы, кажется, отсутствует {}в команде pandoc

find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md 

Но тогда у вас будут имена файлов 001.htm.md- вам придется решить, если это проблема.

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