CLI: переименование командного файла - с помощью CONTENT ?? (например, конкретный текст, указанный в файле)

2

Я хотел бы пакетно переименовать файлы (* .txt), вставив номер формата 'RXR1234567' (RXR + 7 цифр) [если такое число (и в идеале только один) находится в тексте] в начале имени файла, например, вместо

letter_235.txt

файл должен называться

RXR1234567_letter_235.txt

Может ли это быть сделано из командной строки (grep, rename)? Файлы находятся в разных подкаталогах.

Ваши мысли будут оценены (как всегда).

аджо
источник

Ответы:

1

Попробуйте это в корневом каталоге:

find -name '*.txt' -exec sh -c 'PREFIX=`grep -m 1 -oe "RXR[0-9]\{7\}" "$0"` && mv "$0" "${0%/*}/${PREFIX}_${0##*/}"' {} \;

Примечание. Если файл содержит несколько совпадений шаблона, будет использоваться первый.

Кир
источник
Я немного опасаюсь, чтобы сделать mv прямо сейчас ... Я сделал PATTERN = 'RXR [0-9] \ {7 \}', но хотел бы сначала посмотреть, что происходит: grep $ PATTERN * .txt is Хорошо, но: grep $ PATTERN * .txt -exec sh -c 'grep $ PATTERN "$ 0 $"' {} \; просто создает строки типа '<filename>: 0'
ajo
... опечатка выше: я сделал "$ 0", а не "$ 0 $"
ajo
Я думал, что это PATTERNбыло раньше известно как простой текст, а не как регулярное выражение. Я отредактировал ответ, теперь он должен делать то, что вы хотите (см. Примечание). В любом случае вы можете проверить эффекты этой команды, заменив mv ...с echo mv ..и удаления > /dev/null. Если что-то неясно, просто спросите!
cyrus
find -name ' .txt' -exec sh -c 'PREFIX = grep -m 1 -oe "RXR[0-9]\{7\}" "$0"&& echo $ {PREFIX}' {} \; - это заставляет меня видеть все результаты RXR (я впечатлен!); Я постараюсь отдохнуть через минуту
ajo
к сожалению, вторая часть не работает ?! (файлы кажутся без изменений). Что означает $ {0% / *} (? Каталог) и $ {0 ## * /} (? Имя файла)? - На самом деле, подкаталоги не являются необходимыми, если бы я мог заставить их работать в одном каталоге, который уже был бы великолепен ...
ajo