Як я можу скопіювати файли з повторюваними іменами в один каталог і зберегти обидва файли, отримавши копії (файли) автоматично перейменувати?


11

У ОС Windows, коли ви копіюєте файл у каталог, у якому вже є файл з таким ім'ям, він запитує, чи бажаєте ви:

  1. скопіюйте файл та замініть / перезапись існуючого
  2. скасувати копіювання нового файлу в каталог
  3. скопіюйте файл, але перейменуйте його (як-то на кшталт "filename - copy (1)")

Коли я роблю це в Ubuntu, у мене немає 3-го варіанта (що багато разів є дуже корисним варіантом). Чи є можливість зробити це в Ubuntu?

Відповіді:


17

На жаль, у Nautilus немає такої можливості.

Варіант 1: Інший файловий менеджер

Ви можете спробувати інший файловий менеджер на зразок Dolphin .

Встановіть Dolphin(потрібен сховище Всесвіту )

Варіант 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 також немає можливості, про яку я маю на увазі. Він просто має: Скасувати, Пропустити всіх, Пропустити, Замінити, Замінити все. Випробує Дельфіна.
heisenbergman

1
Дельфін чудово підходить для цього :)
heisenbergman

Дякуємо, що випробували їх. Я оновлю своє запитання відповідно до ваших висновків.
Девід Фоерстер

@heisenbergman, Привіт, що ти мав на увазі під дельфіном для цього чудово? Він пропонує можливість перейменувати, але він все ще дозволяє мені перейменувати файли по черзі. На жаль, опцію "застосувати до всіх" не можна використовувати з опцією перейменування. Це досить марно для великої кількості файлів. Це лише моя версія? Чи вдалося вам перейменувати всі ваші парні відразу (як ви можете в Windows), використовуючи Dolphin?
Квоте

1
@ n1k31t4 Прочитайте --backup=existingще раз опис . Підказка: Що відбувається в наступному випадку touch foo bar; cp -v --backup=numbered foo bar; cp -v --backup=existing foo bar:?
Девід Фоерстер

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.