1

У меня есть каталог и много других подкаталогов, таких как следующие -

file with spaces.txt
filewithsuperlonglines.txt
ordinaryfile.txt
binaryfile.bin

Команда -

находить . тип f -print0 | файл xargs -0 | текст grep | grep -v долго | cut -d: -f1

создает правильный список файлов (т.е. текстовые файлы, которые не содержат очень длинные строки)

./file with spaces.txt
./ordinaryfile.txt

Но когда я добавляю еще один xargs в конец команды, я получаю ошибки -

находить . тип f -print0 | файл xargs -0 | текст grep | grep -v долго | cut -d: -f1 | xargs -0 awk -f someprocessing.awk

gawk: someprocessing.awk:3: fatal: cannot open file `./file' for reading (No such file or directory)

Содержимое someprocessing.awk не имеет значения, поскольку я получаю ту же ошибку, если вместо этого использую команду cat .

Как получить команду после последнего канала для работы с файлами с пробелами в их именах?

2 ответа2

2

find -print0 выдает выходные данные с нулевыми символами в качестве разделителей. xargs -0 требует ввода с нулевыми символами в качестве разделителей. Ваша первая команда xargs получает нулевые символы из find ; второй вместо этого видит символы новой строки.

Попробуй это:

find . -type f -print0 | \
    xargs -0 file | \
    grep text | \
    grep -v long | \
    cut -d: -f1 | \
    tr '\n' '\0' | \
    xargs -0 awk -f someprocessing.awk

(Это должно работать для GNU Coreutils версии tr ; я не уверен насчет других реализаций tr .)

0

Принятое решение облажается, если имя файла содержит «:». Следующее произойдет только в том случае, если имена файлов содержат «:» и избегают манипулирования \0:

find . -type f | parallel file | grep text | grep -v long |\
parallel --colsep ': ' awk -f someprocessing.awk {1}

Он использует GNU Parallel, так что вы получите awk, выполненный параллельно, бесплатно.

Посмотрите вступительные видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .