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>

Як видно з сторінки 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>

1
+1 для надзвичайно чистого рішення. До речі, опція присутня і на RHEL 6.
Paweł Brodacki

Хоча приємна функціональність, це не дуже допомагає в моєму випадку, оскільки він додасть суфікс після розширення, тому файли будуть мати такі назви, як .jpg ~ 1 ~, тоді як мені потрібно, щоб вони були названі _1.jpg. Можливо, я буду використовувати mmv для перейменування файлів після їх переміщення.
theduke

4
це команда ММВ , яка буде досягну бажаного результату після виконання мв --backup = пронумеровані: MMV -v " " # 1_ # 3. # 2 "~ * ~."
theduke

У моїй системі Debian (mmv 1.01b-18) правильною командою mmv є:mmv -v "*.*~*~" "#1_#3.#2"
Xavier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.