Bash: Найти все файлы с указанным расширением c и переименовать их в соответствии с первой строкой содержимого в каждом файле - PullRequest
0 голосов
/ 05 апреля 2020

Я знаю, что их часто просят, но у меня возникли проблемы с поиском правильного сценария для этого.

Я пытался использовать:

for fname in find . -type f -name "*.txt"; do mv $fname $(grep -m 1 "specific text" *.txt).txt; done

Но я не мог заставить его работать правильно.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 05 апреля 2020
find . -type f -name '*.txt' -exec sh -c '
  for file; do
    if newname=$(grep -m1 "specific text" "$file"); then
       echo mv -i "$file" "${file%/*}/${newname}.txt" 
    fi
  done
' sh {} +

Переименовывает только файлы, соответствующие шаблону grep. Расширение параметра ${file%/*} удаляет имя файла из пути и оставляет часть каталога $file, а опция -i предлагает перезаписать уже существующий файл.

Если выходные данные выглядят как ожидалось, удалите echo перед mv и еще раз введите команду для переименования файлов.

...