Bagaimana saya bisa menyalin file dengan nama file duplikat ke satu direktori dan menyimpan kedua file dengan memiliki duplikat yang mengubah nama secara otomatis?

11

Di OS Windows, ketika Anda menyalin file ke direktori yang sudah memiliki file dengan nama itu, ia bertanya apakah Anda ingin:

  1. salin file dan ganti / timpa yang sudah ada
  2. batalkan menyalin file baru ke direktori
  3. menyalin file, tetapi ganti namanya (sebagai sesuatu seperti "nama file - copy (1)")

Ketika saya melakukan ini di Ubuntu, saya tidak memiliki opsi ke-3 (yang merupakan opsi yang sangat berguna). Apakah ada cara untuk melakukannya di Ubuntu?

Heisenbergman
sumber

Jawaban:

17

Sayangnya Nautilus tidak memiliki opsi itu.

Opsi 1: Manajer file yang berbeda

Anda dapat mencoba pengelola file lain seperti Dolphin .

Instal Dolphin(membutuhkan repositori Universe )

Opsi 2: Baris perintah

Anda juga dapat menggunakan program baris perintah cp(1)dengan opsi cadangan:

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

Ini memiliki efek berikut yang dapat dikontrol dengan opsi lain seperti yang dijelaskan di halaman manual cp(1):

--backup[=CONTROL] - buat cadangan setiap file tujuan yang ada

-b- suka --backuptetapi tidak menerima argumen

-S, --suffix=SUFFIX- mengganti suffix cadangan yang biasa

Suffix cadangan adalah ~, kecuali diatur dengan --suffixatau SIMPLE_BACKUP_SUFFIX. Metode kontrol versi dapat dipilih melalui --backupopsi atau melalui VERSION_CONTROLvariabel lingkungan. Inilah nilainya:

  • none, off: jangan pernah membuat cadangan (meskipun --backupdiberikan)
  • numbered, t: buat cadangan bernomor
  • existing, nil: bernomor jika ada cadangan bernomor, sederhana jika tidak
  • simple, never: selalu buat cadangan sederhana

Contoh

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

Ini akan menyalin semua file ~/Musicke ~/Videos. Jika file dengan nama yang sama ada di tujuan, itu diganti namanya dengan menambahkan .orignamanya sebagai cadangan. Jika file dengan nama yang sama dengan cadangan ada, cadangan sebaliknya diganti dengan menambahkan .1dan jika ada juga .2dan sebagainya. Hanya kemudian file sumber disalin ke tujuan.

Jika Anda ingin menyalin file dalam subdirektori, gunakan secara rekursif:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
David Foerster
sumber
Terima kasih atas sarannya untuk menggunakan file manager yang berbeda. Sayangnya, Thunar juga tidak memiliki opsi yang saya maksud. Itu hanya memiliki: Batalkan, Lewati Semua, Lewati, Ganti, Ganti Semua. Akan mencoba Dolphin.
heisenbergman
1
Dolphin bekerja sangat baik untuk ini :)
heisenbergman
Terima kasih telah mencoba keduanya. Saya akan memperbarui pertanyaan saya sesuai dengan temuan Anda.
David Foerster
@heisenbergman, Hai apa yang Anda maksud dengan Dolphin sangat bagus untuk ini? Itu memang menawarkan opsi untuk mengubah nama, tetapi masih hanya memungkinkan saya untuk mengubah nama file satu per satu. Sayangnya opsi "apply to all" tidak dapat digunakan dengan opsi untuk mengganti nama. Ini sangat tidak berguna untuk sejumlah besar file. Apakah ini hanya versi saya? Apakah Anda berhasil mengubah nama semua ganda sekaligus (seperti Anda dapat menggunakan Windows), menggunakan Dolphin?
Kvothe
2

Menemukan ini di superuser :

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

File yang memiliki nama yang sama akan diganti namanya menjadi file dengan md5sum ditambahkan ke nama. Jika Anda menyimpannya ke nama file seperti "saveCopy" Anda dapat menggunakan findseperti ini untuk menjalankannya:

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

Untuk lebih lanjut tentang ini, lihat tautannya.

Rinzwind
sumber
0

Salin skrip ini ke direktori teratas, buat itu dapat dieksekusi dan jalankan:

#!/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
sumber