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

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

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

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

27 голосов | спросил Alexander Dzyoba 14 J000000Thursday11 2011, 13:56:02

3 ответа


33

Многие инструменты 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 .

ответил Gilles 24 J000000Sunday11 2011, 02:41:42
6

Я пробовал

apropos copy | grep "(1)" 

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

man mcopy 

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

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

mcopy -D A f* a 

для тестов для autorename и targetdir 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, где используется ограничение количества затронутых файлов. Я не тестировал сценарий для более глубоких файловых структур, а также для пробелов в именах файлов и других, напуганных символов, таких как linefeed, pagefeed и т. Д.

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

ответил user unknown 15 J000000Friday11 2011, 00:23:30
0

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

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

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

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

ответил jmtd 14 J000000Thursday11 2011, 17:44:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132