2015-07-29 2 views
3

У меня есть структура каталоговxargs или хвост дает ошибку с пробелами в именах каталогов

Dir 1 
Dir 2 
Dir 3 

, поэтому каждый из имен каталогов содержит пробел.

В каждом каталоге содержится файл batch_output.txt. Каждый из этих файлов начинается с строки заголовка, а затем с данными на следующих строках.

Я хочу добавить эти файлы данных, а заголовок один раз наверху (так что заголовок должен быть извлечен только из первого файла, а не повторно). Команда

find . -name batch_output.txt -type f 

возвращает пути к batch_output.txt файлов просто отлично, но моя попытка добавить данные с помощью команды

find . -name batch_output.txt -type f | xargs -n 1 tail -n +2 

дает мне ошибки

tail: cannot open ‘./Dir’ for reading: No such file or directory 
tail: cannot open ‘1/batch_output.txt’ for reading: No such file or directory 
tail: cannot open ‘./Dir’ for reading: No such file or directory 
tail: cannot open ‘2/batch_output.txt’ for reading: No such file or directory 
tail: cannot open ‘./Dir’ for reading: No such file or directory 
tail: cannot open ‘3/batch_output.txt’ for reading: No such file or directory 

I think tail имеет проблему с пробелами в именах каталогов.

При условии, что я должен сохранить пробелы в именах каталогов, как решить эту проблему?

ответ

3

Попробуйте -print0 вариант с -0 опцией в xargs:

find . -name batch_output.txt -type f -print0 | xargs -0 -n 1 tail -n +2 

Как на man find:

-print0 
    This primary always evaluates to true. It prints the pathname of the current file 
    to standard output, followed by an ASCII NUL character (character code 0). 
+0

Практически работает. Данные добавляются просто отлично, но первый заголовок отсутствует. Я хочу сохранить заголовок в первый раз, но не повторять его позже. Кроме того, я нахожу описание аргумента '-print0' немного неясным. Почему он решает проблему с пробелами в именах каталогов по сравнению с командой без '-print0'. И что делает аргумент '-0' для' xargs' точно? – Adriaan

+1

Вместо того, чтобы завершать каждое имя файла символом новой строки, он завершает его с помощью ASCII 0 или '\ 0'. 'xargs -0' считывает входные данные с нулевым завершением. – anubhava

+1

Прочитайте 'man xargs' и раздел about' -0', который говорит: ** '-0 Измените xargs, чтобы ожидать символов NUL (' '\ 0 '') в качестве разделителей вместо пробелов и строк новой строки. Ожидается, что будет использоваться совместно с функцией -print0 в find (1). ** ** – anubhava

1

Используйте -exec аргумент find:

find . -name batch_output.txt -type f -exec tail -n +2 {} \; 

Если вы хотите т о поместить вывод в новый файл, просто перенаправить его:

find . -name batch_output.txt -type f -exec tail -n +2 {} \; > /path/to/outfile 
+0

Практически работает.Данные добавляются просто отлично, но первый заголовок отсутствует. Я хочу сохранить заголовок в первый раз, но не повторять его позже. – Adriaan

+0

В этом случае я, вероятно, рекомендовал бы повторять вывод строки в выходной файл отдельно и добавить результаты команды 'find' с помощью' >>/path/to/outfile' – arco444

0

Это tail, который не получает ни одного цитируемый файла. Используйте -I аргумент для xargs:

find . -name batch_output.txt -type f | xargs -I X tail -n +2 X 
0

Я считаю, что следующий скрипт работает достаточно.

#!/bin/bash 
clear 
clear 

# Extract first line from the first hit by 'find'. 
find . -name batch_output.txt -type f -print0 -quit | xargs -0 -n 1 head -n 1 > output.txt 

# Append all the data after the first line. 
find . -name batch_output.txt -type f -print0 | xargs -0 -n 1 tail -n +2 >> output.txt 
+1

Это действительно решение, которое я представил в своем [ответе ] (http://stackoverflow.com/a/31698310/548225). Вы должны принять ответ, а не принимать предоставленное решение и опубликовать на его основе другой ответ. – anubhava

+0

@anubhava Hmmm .... нет точно. Ваш ответ не включает извлечение заголовка, поэтому я решил опубликовать более полный ответ;). В любом случае, я благодарен за вашу помощь, и это, конечно, не мое намерение удерживать от вас какие-либо кредиты. Если вы хотите, я, безусловно, могу принять ваш ответ. Дай мне знать ;). Еще раз спасибо! – Adriaan

+1

. Главным моментом моего ответа было использование '-print0' в' find' и '-0' в' xargs', так как вы получаете эти ошибки, и это то, что ваши комментарии также предложили. Я просто повторно использовал ту же команду 'xargs', которую вы поставили под вопрос, полагая, что она работает на вас. Вы можете просто оставить комментарий, предлагая вам больше комбинаций головы и хвоста, и я бы отредактировал свой ответ. – anubhava

Смежные вопросы