Переформатирование большого количества XML-файлов

Возможно, это может быть полезно

Редакторы HTML/PHP Blue Fish http://bluefish.linuxave.net

Спасибо...

11
14.01.2017, 23:39
2 ответа

Это может быть сделано от find непосредственно использование -exec:

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

Чему передается -exec будет вызван однажды на файл, найденный с шаблонными параметрами {} будучи замененным текущим именем файла. \; на конце команды находки только завершает строку.

Использование xargs не действительно необходимо в этом случае, потому что мы должны вызвать xmllint однажды на файл как оба входные и выходные имена файлов должны быть указаны в том же вызове.

xargs был бы необходим, если бы команда, передаваемая по каналу к от находки, работала над несколькими файлами за один раз, и тот список был длинен. Вы не можете сделать этого в этом случае, поскольку необходимо передать единственное имя файла --output опция xmllint. Без xargs Вы могли заканчивать со "Списком аргументов слишком долго" ошибка при обработке большого количества файлов. xargs также строки замены файла поддержек с -I опция:

find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'

Сделал бы то же как find -exec команда выше. Если какая-либо из Ваших папок будет иметь нечетные символы в подобных пробелах, то необходимо будет использовать -0 опции find и xargs. Но использование xargs с -I подразумевает опцию -L 1 что означает только процесс 1 файл за один раз так или иначе, таким образом, можно также непосредственно использовать find с -exec.

23
27.01.2020, 19:57
  • 1
    @manatwork благодарит за редактирования - липкие пальцы; o) –  didster 08.10.2012, 10:46
  • 2
    я просто выполнил это и это, кажется, работает обработка! Большое спасибо за быстрый и краткий ответ! –  Harry 08.10.2012, 11:03
  • 3
    “ Это перестанет работать, если список файлов будет слишком большим”: Нет, это не перестанет работать (это обрабатывает единственный файл за один раз), и на самом деле find … -exec самый прямой путь состоит в том, чтобы сделать это. –  Gilles 'SO- stop being evil' 09.10.2012, 02:02
  • 4
    @Gilles! Я обновил свой ответ соответственно. –  didster 11.10.2012, 10:31

Я обычно принимаюсь за решение этих проблем со слоем косвенности. Запишите сценарий оболочки, который делает то, что Вы хотите, и вызов это. Я предложил бы как запуск

#! /bin/sh
for file
do
   xmllint --format $file > $file.tmp && mv $file.tmp $file
done

Попытка это на файле или два вручную, затем можно заменить его в xargs

find . -name "*.xml" -type f | xargs -- xmltidy.sh
6
27.01.2020, 19:57
  • 1
    Это похоже на хороший подход, если я должен должен быть сделать более сложное управление в будущем. Спасибо за ответ. –  Harry 08.10.2012, 11:05

Теги

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