Копировать файлы с переименованием

28

У меня огромное дерево файлов. Некоторые файлы имеют одинаковые имена, но в другом случае, например, some_code.cи Some_Code.c.

Поэтому, когда я пытаюсь скопировать его в файловую систему NTFS / FAT, он спрашивает меня, хочу ли я заменить файл или пропустить его.

Есть ли способ автоматически переименовать такие файлы, например, добавив  (1)к имени файла конфликта (как это делает Windows 7)?

Александр Дзёба
источник
Любопытно. Я просто хотел посмотреть, какую ошибку я получу, если попытаюсь создать файл с таким же именем на NTFS-разделе (в соответствии с HPFS / NTFS sudo fdisk -l /dev/sda), и сделал touch foo; touch Fooи закончил двумя файлами fooи Foo. Но мне не интересно, достаточно ли перезагрузиться в Windows, чтобы посмотреть, как они там выглядят. Migth это просто FAT-проблема? Ах, у меня есть USB-флешка с файловой системой FAT, и я могу создать FAT-систему внутри файла ... - пожалуйста, один момент. :)
пользователь неизвестен

Ответы:

41

Многие инструменты GNU , такие как cp, mvи tarподдержка создания резервных копий файлов , когда цель существует. То есть, при копировании fooв bar, если уже существует файл с именем bar, существующий bar будет переименован, а после копии barбудет содержать содержимое foo. По умолчанию barпереименовывается в bar~, но поведение может быть изменено:

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

Существуют и другие варианты, например создание пронумерованных резервных копий, только если они уже существуют. Смотрите руководство coreutils для более подробной информации.

Жиль "ТАК - перестань быть злым"
источник
1
Brilliant. Я не знал, что этот вариант существует, и он оказался чрезвычайно полезным. Спасибо, Жиль.
Стив Хилл,
2
У OSX cp нет флага --backup. используйте brew install coreutilsи затем используйте команду gcpвместо этого.
Уэстон Гангер
6

Я пытался

apropos copy | grep "(1)" 

чтобы найти возможных кандидатов, и Макопи обнаружился.

man mcopy 

показывает перспективный вариант -D clash-option, разве это не круто? Но не так круто - это не описано. Но есть некоторые намеки на mtools.dvi, который я искал в своей системе, но безуспешно и через Google, но безуспешно, но затем, с помощью Google, я искал непосредственно mcopy clash-optionи нашел этот сайт .

Я сделал короткий тест

mcopy -D A f* a 

для проверки на autorename и targettdir a- вместо автоматического переименования он спрашивал меня о каждом файле, чтобы игнорировать или переопределять, это глупое s ....

Моя версия mtools-4.0.10и страница справки с 1996 года - 15 лет. Должны ли мы действительно потерять некоторые функции?

Я бы разделил работу на два этапа:

  • Сделайте короткую функцию, которая генерирует уникальное имя для файла, если это имя занято.
  • Запустите findи выполните этот скрипт для каждого файла, который вы хотите скопировать.

Должны ли мы помочь в этом подходе? :)

Вот скрипт для автоматического переименования файлов:

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

и это мой тестовый вызов:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

Примечание: -maxdepth, -name и -type используются для значительного ограничения количества затронутых файлов. Я не проверял скрипт на предмет более глубоких файловых структур, а также на наличие пробелов в именах файлов и других, прикольных символов, таких как перевод строки, перевод страницы и так далее.

Я использовал .1, потому что это не создает проблем в большинстве команд, в то время как (и a) часто требуют маскировки.

неизвестный пользователь
источник
0

По cpкрайней мере, не с GNU .

Настоятельно рекомендуется не иметь повторяющихся имен файлов (игнорируя регистр), они просто причинят вам боль. Найдите список таких дубликатов, используя

find . | tr A-Z a-z | sort | uniq -d

Затем вручную переименуйте один из файлов для каждой строки, если вывод. Старайтесь избегать создания дубликатов в будущем.

jmtd
источник
Парень никогда не подразумевал, что он тот, кто создал этот беспорядок.
чепанг
Ну, да, правда, но он один страдает от последствий ☺
JMTD
У меня есть ситуация, когда я получал резервные копии из немного разных времен. Хочу объединить их, но не раздробить разные версии. Например, насколько я знаю, чем старше, тем лучше. Могу сказать только после того, как осмотрю. А пока нужно копировать и переименовывать резервные копии.
abalter