Как я могу скопировать файлы с дублирующимися именами файлов в один каталог и сохранить оба файла, автоматически переименовывая дубликаты?


11

В ОС Windows, когда вы копируете файл в каталог, в котором уже есть файл с таким именем, он спрашивает, хотите ли вы:

  1. скопировать файл и заменить / перезаписать существующий
  2. отменить копирование нового файла в каталог
  3. скопируйте файл, но переименуйте его (как-то вроде «filename - copy (1)»)

Когда я делаю это в Ubuntu, у меня нет этого третьего варианта (который часто очень полезен). Есть ли способ сделать это в Ubuntu?

Ответы:


17

К сожалению, Наутилус не имеет такой возможности.

Вариант 1: другой файловый менеджер

Вы можете попробовать другой файловый менеджер, такой как Dolphin .

Установить Дельфин(требуется хранилище Universe )

Вариант 2: Командная строка

Вы также можете использовать программу командной строки cp(1)с опцией резервного копирования:

cp --backup -t DESTINATION SOURCE [SOURCE...]

Это имеет следующие эффекты, которыми можно управлять с помощью других опций, как описано на странице руководства cp(1):

--backup[=CONTROL] - сделать резервную копию каждого существующего файла назначения

-b- нравится, --backupно не принимает аргумент

-S, --suffix=SUFFIX- перекрыть обычный суффикс резервной копии

Суффикс резервной копии есть ~, если он не установлен с помощью --suffixили SIMPLE_BACKUP_SUFFIX. Метод контроля версий может быть выбран с помощью --backupпараметра или VERSION_CONTROLпеременной среды. Вот значения:

  • none, off: Никогда не делать резервные копии (даже если --backupдано)
  • numbered, t: Делать нумерованные резервные копии
  • existing, nil: пронумерованы, если существуют пронумерованные резервные копии, просто в противном случае
  • simple, never: Всегда делать простые резервные копии

пример

cp --backup=existing --suffix=.orig -t ~/Videos ~/Music/*

Это будет копировать все файлы ~/Musicс ~/Videos. Если файл с тем же именем существует в месте назначения, он переименовывается путем добавления .origего имени в качестве резервной копии. Если существует файл с тем же именем, что и у резервной копии, резервная копия вместо этого переименовывается путем добавления, .1а также если она существует, .2и так далее. Только после этого исходный файл копируется в место назначения.

Если вы хотите копировать файлы в подкаталогах рекурсивно, используйте:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music

Спасибо за предложение использовать другой файловый менеджер. К сожалению, Thunar также не имеет возможности, о которой я говорю. Он просто имеет: Отмена, Пропустить все, Пропустить, Заменить, Заменить все. Попробую Дельфин.
Гейзенбергман

1
Дельфин отлично
подходит

Спасибо, что попробовали два. Я обновлю свой вопрос в соответствии с вашими выводами.
Дэвид Фёрстер

@heisenbergman, Привет, что ты имеешь в виду под Дельфином? Он предлагает возможность переименовать, но все же позволяет мне переименовывать файлы по одному. К сожалению, параметр «Применить ко всем» нельзя использовать с параметром переименования. Это совершенно бесполезно для большого количества файлов. Это только моя версия? Удалось ли вам переименовать все ваши двойники одновременно (как в Windows), используя Dolphin?
Kvothe

Последняя часть о добавлении идентификаторов номеров к каждому файлу, если он уже существует, не работает для меня :( Он копирует первый файл file.json, затем я получаю file.json.json(используя --suffix=json), а затем я получаю сообщение об ошибке, в котором говорится, что он не может перезаписать существующий файл Используя Ubuntu 18, получаю следующие результаты find:. find ./ -name 'meta.json' | xargs cp --backup=existing --suffix=.json -t ~/data/Я получаю 3 файла, как описано выше, затем ошибка:. cp: will not overwrite just-created '/home/user/data/meta.json' with './path/to/meta.json'Я также пробовал -I {}заполнители с xargs.
n1k31t4

2

Нашел это на суперпользователе :

#!/bin/bash
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"

Файл с таким же именем переименовывается в файл с добавленной к имени md5sum. Если вы сохраните его в файле с именем «saveCopy», вы можете использовать его для запуска find:

find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;

Подробнее об этом смотрите по ссылке.



0

Скопируйте этот скрипт в верхний каталог, сделайте его исполняемым и запустите его:

#!/bin/bash

## Get a list of all files
list=$(find . -mindepth 2 -type f -print)
nr=1

## Move all files that are unique
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
    mv -n $file ./
done
list=$(find . -mindepth 2 -type f -print)

## Checking which files need to be renamed
while [[ $list != '' ]] ; do
   ##Remaming the un-moved files to unique names and move the renamed files
   find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
       current_file=$(basename $file)
       mv -n $file "./${nr}${current_file}"
   done
   ## Incrementing counter to prefix to file name
   nr=$((nr+1))
   list=$(find . -mindepth 2 -type f -print)
done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.