Jak mogę skopiować pliki ze zduplikowanymi nazwami plików do jednego katalogu i zachować oba pliki poprzez automatyczną zmianę nazwy duplikatów?

11

W systemie operacyjnym Windows podczas kopiowania pliku do katalogu, w którym znajduje się już plik o tej nazwie, pojawia się pytanie, czy chcesz:

  1. skopiuj plik i zastąp / zastąp istniejący
  2. anuluj kopiowanie nowego pliku do katalogu
  3. skopiuj plik, ale zmień jego nazwę (jako coś w stylu „nazwa pliku - kopia (1)”)

Kiedy robię to w Ubuntu, nie mam tej trzeciej opcji (która jest często bardzo przydatną opcją). Czy jest jakiś sposób, aby to zrobić w Ubuntu?

heisenbergman
źródło

Odpowiedzi:

17

Niestety Nautilus nie ma tej opcji.

Opcja 1: inny menedżer plików

Możesz spróbować innego menedżera plików, takiego jak Dolphin .

Zainstaluj Dolphin(wymaga repozytorium Universe )

Opcja 2: wiersz poleceń

Możesz również użyć programu wiersza polecenia cp(1)z opcją tworzenia kopii zapasowych:

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

Daje to następujące efekty, którymi można sterować za pomocą innych opcji opisanych na stronie podręcznika cp(1):

--backup[=CONTROL] - wykonaj kopię zapasową każdego istniejącego pliku docelowego

-b- jak, --backupale nie przyjmuje argumentu

-S, --suffix=SUFFIX- zastąp zwykły przyrostek kopii zapasowej

Przyrostek kopii zapasowej ~, chyba set --suffixlub SIMPLE_BACKUP_SUFFIX. Metodę kontroli wersji można wybrać za pomocą --backupopcji lub VERSION_CONTROLzmiennej środowiskowej. Oto wartości:

  • none, off: nigdy nie twórz kopii zapasowych (nawet jeśli --backuppodano)
  • numbered, t: wykonaj numerowane kopie zapasowe
  • existing, nil: numerowane, jeśli istnieją numerowane kopie zapasowe, w przeciwnym razie proste
  • simple, never: zawsze wykonuj proste kopie zapasowe

Przykład

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

Spowoduje to skopiowanie wszystkich plików ~/Musicdo ~/Videos. Jeśli plik o tej samej nazwie istnieje w miejscu docelowym, jego nazwa zostaje zmieniona przez dołączenie .origdo jego nazwy jako kopii zapasowej. Jeśli istnieje plik o tej samej nazwie co kopia zapasowa, nazwa kopii zapasowej jest zmieniana przez dołączenie, .1a jeśli tak, to istnieje .2i tak dalej. Tylko wtedy plik źródłowy jest kopiowany do miejsca docelowego.

Jeśli chcesz skopiować pliki do podkatalogów, użyj rekurencyjnie:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
David Foerster
źródło
Dziękujemy za sugestię, aby użyć innego menedżera plików. Niestety Thunar również nie ma opcji, o której mówię. Ma po prostu: Anuluj, Pomiń wszystko, Pomiń, Zamień, Zamień wszystko. Spróbuje Dolphin.
heisenbergman
1
Dolphin świetnie się do tego
nadaje
Dzięki za wypróbowanie dwóch. Zaktualizuję moje pytanie zgodnie z twoimi ustaleniami.
David Foerster,
@heisenbergman, Cześć, co miałeś na myśli przez Dolphin działa świetnie w tym celu? Oferuje opcję zmiany nazwy, ale nadal pozwala mi tylko zmieniać nazwy plików jeden po drugim. Niestety nie można użyć opcji „zastosuj do wszystkich” z opcją zmiany nazwy. Jest to dość bezużyteczne w przypadku dużej liczby plików. Czy to tylko moja wersja? Czy udało Ci się zmienić nazwę wszystkich twoich podwójnych naraz (tak jak w Windowsie), używając Dolphin?
Kvothe
1
@ n1k31t4 Przeczytaj opis --backup=existingponownie. Wskazówka: Co dzieje się w następującym przypadku touch foo bar; cp -v --backup=numbered foo bar; cp -v --backup=existing foo bar:?
David Foerster
2

Znaleziono to na superużytkowniku :

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

Nazwa pliku o tej samej nazwie zostaje zmieniona na plik z dodaną sumą md5sum. Jeśli zapiszesz go pod nazwą pliku „saveCopy”, możesz użyć findtego w następujący sposób:

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

Aby uzyskać więcej informacji na ten temat, zobacz link.

Rinzwind
źródło
0

Skopiuj ten skrypt do górnego katalogu, uczyń go wykonywalnym i uruchom go:

#!/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
warhansen
źródło