Найдите строку в файле и переименуйте несколько файлов в результаты

Я пытаюсь рекурсивно искать список файлов, и если файл содержит строку, переименуйте файл в результаты grep указанной строки.

Файлы примеров содержат следующее содержимое:

file1 foo bar1 file2 foo bar2 file3 foo bar3 file4 foo bar4 file5 foo bar5 

grep + awk вернет результаты, которые мне нужны:

 $ grep -r "^foo" . | awk '{print $2}' bar1 bar2 bar3 bar4 bar5 

Я застрял в передаче этих результатов команде mv.

 $ grep -r "^foo" . | awk '{print $2}' | xargs -I{} mv {} . mv: cannot stat 'bar1': No such file or directory mv: cannot stat 'bar2': No such file or directory mv: cannot stat 'bar3': No such file or directory mv: cannot stat 'bar4': No such file or directory mv: cannot stat 'bar5': No such file or directory 

Заранее спасибо. Gnu / BSD Grep имеют одинаковые результаты.

3 Solutions collect form web for “Найдите строку в файле и переименуйте несколько файлов в результаты”

Я бы использовал оболочку для цикла:

 for match in "$(grep -ro '^foo.*')";do echo mv "${match%:*}" "${match#*:}" done 

Это приведет к итерации всего совпадающего file:matching-substring и использования операторов строк % и # чтобы удалить все до, соответственно. все после, и в том числе :

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

 for match in $(grep -r '^foo');do 

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

Если вы хотите сопоставить один шаблон, но переименуйте файл во второе слово в соответствующей строке:

 for match in "$(grep -ro '^foo.*')";do fname=$("echo ${match#*:}|awk '{print $2}'") echo mv "${match%:*}" "$fname" done 

Вы можете делать то, что вы пытаетесь выполнить с помощью Perl:

 #!/usr/bin/env perl use strict; my $dir = "/path/to/directory"; chdir $dir or die "Cannot open $dir!"; my @files = grep { -f } glob("*"); foreach my $file(@files) { open F1, "<", $file or die "Cannot open file $file! $!\n"; while ( <F1> ){ chomp; my @strings = split(' '); if($strings[1] =~ /bar/){ system("/bin/mv $file $strings[1]"); } } close(F1); } 

find . -type f -exec egrep -il '^foo' {} \; | sort | while IFS='' read -r line; do mv -n "$line" "$(dirname "$line")"'/'"$(egrep -i '^foo' "$line" | awk '{ print $2 }')"; done

  • Как выполнить выходную строку без замены команды bash?
  • Grep каталог и возвращаемый список с номерами строк
  • Удаление некоторых из самых больших файлов в каталоге
  • Список файлов с меткой времени с эпохи
  • как суммировать вывод awk или другого выражения с помощью xargs
  • Перенаправление sed для завивки, затем в файл
  • Какова цель команды xargs -I?
  • Xargs для извлечения имени файла
  • Отправка списка (текстового файла) файлов и путей в xargs
  • Почему xargs -I подразумевает -L 1
  • Странная ошибка «Нет такого файла» с «xargs» и «file»
  • Interesting Posts

    Ошибка при запуске сервера vnc

    Вход в несколько файлов во время процесса в фоновом режиме (nohoup)

    Как установить процесс не будет прекращено, когда терминал остановится

    Недоступное поведение базы данных Postfix

    Настройка локального настроенного DNS для использования внешнего DNS для внешней адресации

    SCP без запроса пароля с использованием другого имени пользователя

    Как я могу перекрестно скомпилировать инструмент dd linux для руки?

    Дистанционно отключить вывод дисплея?

    Как Ubuntu основан на Debian?

    Уязвимость Bash CVE-2014-6271 (Shellshock) исправлена ​​на Debian 6.0 (Squeeze)

    Почему в некоторых дистрибутивах Linux есть / dev / ttyS0, ttyS1 и т. Д., Хотя новые компьютеры не имеют такого последовательного порта?

    Грепинг по огромной производительности файла

    Ключ Я могу удерживать только вкладку, заполняющую папку

    Команда SED вместо слова ""

    Как навсегда отключить Orca на Debian Wheezy?

    Linux и Unix - лучшая ОС в мире.