mv, переименуй если есть

26

Мне нужно собрать много изображений в один каталог. Многие из этих изображений имеют одинаковые имена файлов.

Есть ли какая-нибудь безопасная версия, mvкоторая будет автоматически переименовывать файлы, если целевое имя файла уже существует, чтобы это pic1.jpegстало чем-то вроде pic1_2.jpeg?

Я мог бы написать свой собственный скрипт на Python, но там должно быть что-то вроде этого, чтобы я мог сделать:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;
герцог
источник

Ответы:

38

mv уже поддерживает это из коробки (по крайней мере, в Debian):

mv --backup=t <source_file> <dest_file>

Как видно на man-странице mv (1):

--backup[=CONTROL]
         make a backup of each existing destination file

The  backup  suffix  is  `~',  unless  set  with   --suffix   or   SIM‐
PLE_BACKUP_SUFFIX.   The version control method may be selected via the
--backup option or through the  VERSION_CONTROL  environment  variable.

Чтобы создать --backup=tсреднее значение «создавать пронумерованные резервные копии», выполните следующее:

env VERSION_CONTROL=numbered mv --backup=t <source_file> <dest_file>

(dest_file, конечно, может быть каталогом).

Редактировать: в более поздних версиях (по крайней мере, GNU coreutils 8.22, но уже намного раньше) вы можете просто написать

mv --backup=numbered <source_file> <dest_file>
MasterM
источник
1
+1 за удивительно чистое решение. Кстати, опция присутствует и на RHEL 6.
Павел Бродацкий
Несмотря на приятную функциональность, это не очень помогает в моем случае, так как он добавляет суффикс после расширения, поэтому файлы будут иметь имена вроде .jpg ~ 1 ~, тогда как мне нужно, чтобы они назывались _1.jpg. Я, вероятно, буду использовать mmv для переименования файлов после их перемещения.
сентября
4
это команда ММВ , которая будет достигну желаемого результата после выполнения мв --backup = пронумерованы: MMV -v " "# 1_ # 3. # 2" ~ * ~."
theduke
В моей системе Debian (mmv 1.01b-18) правильная команда mmv:mmv -v "*.*~*~" "#1_#3.#2"
Ксавьер