Лучший выходной формат для Xargs - PullRequest
3 голосов
/ 31 января 2010

Я пишу простую программу для запуска через кучу файлов в разных каталогах в моей системе. Это в основном включает их открытие и проверку на допустимый XML. Один из вариантов этой программы - выводить список плохих XML-файлов.

Это подводит меня к моему вопросу. Какой лучший выход для форматирования это для использования с XARGS. Я думал, что помещать каждую запись в новую строку будет достаточно, но это немного сбивает с толку. потому что все имена файлов имеют пробелы.

Скажем, мой вывод:

./dir name 1/file 1.xml
./dir name 2/file 2.xml
./dir name 3/file 3.xml

Я попробовал следующую команду, но она продолжает говорить "Нет такого файла или каталога".

./myprogram.py --list BADXML | xargs -d '\n' cat

Итак ... Я либо неправильно понимаю, как использовать XARGS, либо мне нужно немного изменить формат вывода моей программы. Я не уверен, что самый простой и удобный маршрут). я бы не хотел, чтобы мне всегда приходилось вводить путаницу опций xarg, если я смогу избежать этого.

Ответы [ 3 ]

2 голосов
/ 31 января 2010

man xargs

- ноль

-0 Элементы ввода завершаются нулевым символом вместо пробел, и кавычки и обратный слеш не особенный (каждый персонаж воспринимается буквально). Отключает конец строки файла, который трактуется как любой другой аргумент. Полезно, когда входные элементы могут содержать пробел, кавычки или обратные косые. GNU find -print0 опция производит ввод, подходящий для этот режим.

1 голос
/ 31 января 2010

Вы можете бросить xargs и использовать чтение:

./myprogram.py --list BADXML | while read -a line; do cat "${line[*]}"; done

Все, что может сделать xargs, тогда как циклы чтения могут работать лучше ...

Постскриптум По моему Когда xargs следует отдавать предпочтение перед вопросом while-read-loop * , в ответах подчеркивается очень сильный аргумент эффективности для xargs, хотя моделировать не слишком сложно пакет аргументов xargs с некоторыми дополнительными сценариями, например

batch10cat () {
    local i=1 argv line
    declare -a argv
    while read -r line; do
        argv[i]="$line"
        let i++
        if test $i -gt 10; then i=1; cat "${argv[@]}"; fi
    done
    if test $i -gt 1; then cat "${argv[@]}"; fi
}
./myprogram.py --list BADXML | batch10 cat
0 голосов
/ 10 июня 2010

С GNU Parallel http://www.gnu.org/software/parallel/ вы сможете сделать это без изменений в myprogram.py:

./myprogram.py --list BADXML | parallel cat

Дополнительный бонус: кошка будет работать параллельно и, следовательно, может работать быстрее на многоядерных компьютерах.

...