Почему моя команда xargs с конвейером работает только для одного файла, но не для нескольких? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь передать несколько команд подряд; он работает с одним файлом, но выдает ошибку, когда я пытаюсь использовать несколько файлов одновременно.

Для одного файла в моей рабочей папке:

find . -type f -iname "summary.5runs.*" -print0 | xargs -0 cut -f1-2 | head -n 2
#It works

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

find . -type f -iname "ww.*.out.txt" -print0 | xargs -0 cut -f3-5 | head -n 42 > summary.5runs.txt
#Error: xargs: cut: terminated by signal 13

Полагаю, моя проблема - повторить через несколько файлов, но я не уверен, как это сделать.

1 Ответ

0 голосов
/ 29 августа 2018

Ваш конечный head останавливается после 42 строк общего вывода, но вы хотите, чтобы он работал для каждого файла. В xargs:

можно подделать подоболочку
xargs -0 -I{} bash -c 'cut -f3-5 "$1" | head -n 42' _ {} > summary.5runs.txt

или вы можете сделать его частью действия -exec:

find . -type f -iname "ww.*.out.txt" \
    -exec bash -c 'cut -f3-5 "$1" | head -n 42' _ {} \; > summary.5runs.txt

В качестве альтернативы, вы можете перебрать все файлы в подоболочке, поэтому вам нужно создать только один:

find . -type f -iname "ww.*.out.txt" \
    -exec bash -c 'for f; do cut -f3-5 "$f" | head -n 42; done' _ {} + \
    > summary.5runs.txt

Обратите внимание на {} + вместо {} \;.

...