Быстрое переименование файлов со специальной структурой

0

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

У меня есть коллекция файлов, перечисленных и названных систематически, например

Филеп-х

где x - это число, которое может быть довольно большим, а p - маркер для «макроколлекции». Я хотел бы скопировать все файлы в такой макроколлекции как шаблон и автоматически переименовать все файлы, скопированные как

fileq-х

Другими словами, есть ли возможность, что я могу автоматически заменять имена с помощью терминала (как это возможно во многих редакторах), не работая с дополнительными документами?

Заранее спасибо!

Mdot
источник

Ответы:

2

Это может быть работа pax, если предположить, что существует согласованное соглашение об именах.

cd directory

pax -rws/filep/fileq/ filep-* /path/to/copy/directory
fd0
источник
1

Обычно это можно сделать с помощью bashцикла - не самого быстрого, но простого. В типе терминала:

for f in filep-* ; do mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

Пояснения:

  • for f in filep-* ; do -> для всех вызываемых файлов filep-anythingсделайте следующее
  • mv -iv A Bпереместите (= переименуйте) от A до B, сообщая, что вы делаете, -vи запрашивая подтверждение перед перезаписью существующего файла.-i
  • собирались переместить файл "$f"(кавычки для решения проблем с пробелами в именах файлов) в:
  • $( $echo $f | sed 's/A/B' )напечатайте имя файла, затем используйте, sedчтобы sубрать первый (! и только первый) вхождение Aс помощью B(это также может быть sed 's/this123/that456/', но помните, что оно будет соответствовать первому совпадению)

Чтобы убедиться, что он работает так, как ожидалось, сначала запустите:

for f in filep-* ; do echo mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

Это просто напечатает команду для выполнения для каждого файла и должно выглядеть следующим образом mv -i filep-x fileq-x.

Примечание: это для переименования файлов и, следовательно, после их копирования. Это не делает копирование и переименование в одном. Также он предназначен для выполнения из каталога, в котором находятся файлы.

Fiximan
источник
Я предполагаю, что вы на самом деле не тестировали свой код, потому что for ... in ... doneкоманды, как написано, не могли выполняться должным образом, как вы указали, "$file"но не назначены! Она должна быть "$f"не "$file". Кроме того, вы пытаетесь переместить файл, который не существует, поскольку for f in fileq-*он должен быть for f in filep-*. Существующие файлы имеют pне qранее, чем -в OP и должны быть qчастью переименования. Если я ошибаюсь, то ваша sedкоманда будет неправильной.
user3439894
@ user3439894 - Спасибо за исправления. Я ДЕЙСТВИТЕЛЬНО проверял код, но использовал разные переменные, следовательно, путаница между fileq-и filep-так же как между $fileи $f(это случается со мной в половине моих bashсценариев ... плохая привычка). - Обновлено.
Fiximan