2014-09-28 3 views
2

Я хочу удалить первую строку из всех файлов каталога и сохранить соответствующий вывод, добавив '.tmp' в конце каждого имени файла. Например, если есть файл с именем input.txt с следующим содержанием:Перенаправить вывод xargs в файл

line 1 
line 2 

Я хочу, чтобы создать файл в том же каталоге с именем input.txt.tmp, который будет иметь следующее содержание

line 2 

Я попробовать эту команду:

find . -type f | xargs -I '{}' tail -n +2 '{}' > '{}'.tmp 

проблема заключается в том, вместо того чтобы писать вывод в отдельные файлы с .tmp суффиксом, он создает только один грех gle файл с именем {}.tmp. Я понимаю, что это происходит потому, что перенаправление вывода выполняется после завершения xargs. Но есть ли способ сообщить xargs, что выходное перенаправление является частью его аргумента?

ответ

3

Примечание вы можете использовать find вместе с -exec, без необходимости трубы xargs:

find . -type f -exec sh -c 'f={}; tail -n+2 $f > $f.tmp' \; 
          ^^^^ ^^^^^^^^^^^^^^^^^^^^^ 
           | perform the tail and redirection 
        store the name of the file 
+1

Спасибо это решает мою проблему :) –

+1

Running «ш -c» из 'find' опасно, если имена файлов сделаны злыми людьми , Попробуйте: «коснитесь» foo; echo Naughty naughty - я мог бы удалить файл "перед запуском выше. –

2

Если GNU Parallel вы можете запустить:

find . -type f | parallel tail -n +2 {} '>' {}.tmp 

Все новые компьютеры имеют несколько ядер, но большинство программ имеют последовательный характер и поэтому не будут использовать несколько ядер. Тем не менее, многие задачи чрезвычайно parallelizeable:

  • Выполнить ту же программу на многих файлах
  • Выполнить ту же самую программу для каждой строки в файле
  • Run та же программа для каждого блока в файле

GNU Parallel - это общий параллелизатор и позволяет легко запускать задания параллельно на одном компьютере или на нескольких компьютерах, к которым у вас есть доступ ssh.

Если у вас есть 32 различных заданий, которые вы хотите работать на 4-х процессоров, прямо вперед способ распараллеливания является выполнение 8 заданий на каждом CPU:

Simple scheduling

GNU Parallel вместо порождает новый процесс, когда один заканчивается - поддержание процессоров активным и тем самым экономя время:

GNU Parallel scheduling

Установка

Личная установка не требует доступа root.Это может быть сделано в течение 10 секунд, делая это:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Для других вариантов установки см http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

Другие примеры: http://www.gnu.org/software/parallel/man.html

смотреть интро видео: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Прогулка по t он учебник: http://www.gnu.org/software/parallel/parallel_tutorial.html

Зарегистрируйтесь на список адресов электронной почты, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel

+0

Не забудьте запустить 'parallel -bibtex' один раз и введите' will cite' в приглашении, чтобы отключить уведомление о цитировании без необходимости запускать команду как 'parallel -citation' каждый раз. #вздох –

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