Salin file dengan penggantian nama

28

Saya memiliki pohon file besar. Beberapa file memiliki nama yang sama tetapi dalam kasus yang berbeda, misalnya, some_code.cdan Some_Code.c.

Jadi ketika saya mencoba untuk menyalinnya ke sistem file NTFS / FAT, ia bertanya apakah saya ingin mengganti file atau melewatkannya.

Apakah ada cara untuk secara otomatis mengganti nama file seperti itu, misalnya, dengan menambahkan  (1)nama file konflik (seperti Windows 7)?

Alexander Dzyoba
sumber
Ingin tahu. Saya hanya ingin melihat, kesalahan seperti apa yang saya dapatkan jika saya mencoba untuk menghasilkan file dengan nama yang sama pada partisi NTFS (HPFS / NTFS, menurut sudo fdisk -l /dev/sda), dan melakukan touch foo; touch Foodan diakhiri dengan 2 file foodan Foo. Tapi saya tidak penasaran enogh untuk reboot ke Windows, untuk melihat bagaimana mereka terlihat di sana. Migth itu hanya menjadi FAT-masalah? Ah - Saya punya USB-Stick dengan FAT, dan bisa membuat sistem FAT di dalam file, ... - tolong tunggu sebentar. :)
pengguna tidak diketahui

Jawaban:

41

Banyak alat GNU seperti cp, mvdan tarmendukung pembuatan file cadangan ketika target ada. Artinya, ketika menyalin fooke bar, jika sudah ada file yang dipanggil bar, yang sudah ada bar akan diganti namanya, dan setelah salinan barakan berisi konten foo. Secara default, bardiubah namanya menjadi bar~, tetapi perilaku dapat dimodifikasi:

                                # 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)

Ada varian lain, seperti membuat cadangan bernomor hanya ketika sudah ada. Lihat manual coreutils untuk lebih jelasnya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Cemerlang. Saya tidak tahu opsi ini ada, dan itu terbukti sangat berguna. Terima kasih @Gilles.
Steve Hill
2
OSX cp tidak memiliki flag --backup. gunakan brew install coreutilsdan gunakan perintah gcpsebagai gantinya.
Weston Ganger
6

Saya mencoba

apropos copy | grep "(1)" 

untuk menemukan kandidat yang memungkinkan, dan mcopy muncul.

man mcopy 

menunjukkan opsi yang menjanjikan -D clash-optionbukankah itu keren? Tapi tidak terlalu keren - tidak dijelaskan. Tetapi ada beberapa petunjuk untuk mtools.dvi, yang saya cari di sistem saya, tanpa hasil, dan melalui google, tanpa hasil, tetapi kemudian, dengan google, saya mencari langsung mcopy clash-optiondan menemukan situs ini .

Saya membuat tes singkat

mcopy -D A f* a 

untuk menguji autorename dan targetdir a- alih-alih autorenaming, ia meminta saya untuk setiap file untuk diabaikan atau ditimpa, s bodoh itu ....

Versi saya adalah mtools-4.0.10dan halaman bantuan adalah dari tahun 1996 - 15 tahun. Haruskah kita benar-benar kehilangan beberapa fitur, sementara itu?

Saya akan membagi pekerjaan menjadi dua langkah:

  • Buat fungsi singkat, yang menghasilkan nama unik untuk file, jika nama itu ditempati.
  • Jalankan find, dan jalankan skrip itu untuk setiap file yang ingin Anda salin.

Haruskah kita membantu dalam pendekatan ini? :)

Berikut ini skrip, untuk nama file autorename:

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

dan ini adalah permohonan ujian saya:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

Catatan: -maxdepth, -name dan -type di mana digunakan untuk membatasi jumlah file yang terpengaruh secara dramatis. Saya tidak menguji skrip untuk struktur file yang lebih dalam, juga tidak ada yang kosong dalam nama file dan karakter funky lainnya seperti linefeed, pagefeed, dan sebagainya.

Saya menggunakan .1 karena tidak membuat masalah di sebagian besar perintah, sementara a (dan a) sering perlu masking.

Pengguna tidak diketahui
sumber
0

Setidaknya tidak dengan GNU cp.

Anda sangat disarankan untuk tidak memiliki nama file duplikat (mengabaikan kasus), mereka hanya akan menyebabkan Anda dunia yang sakit. Temukan daftar duplikat tersebut menggunakan

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

Kemudian secara manual ganti nama salah satu file untuk setiap baris jika output. Cobalah untuk menghindari membuat duplikat di masa mendatang.

jmtd
sumber
Lelaki itu tidak pernah menyiratkan bahwa dialah yang menciptakan kekacauan itu.
tshepang
Ya, benar, tetapi dialah yang menanggung akibatnya ☺
jmtd
Saya memiliki situasi di mana saya berakhir dengan cadangan dari waktu yang sedikit berbeda. Ingin menggabungkan mereka, tetapi tidak mengalahkan versi yang berbeda. Misalnya, yang saya tahu, yang lebih tua mungkin lebih baik. Hanya bisa tahu setelah saya periksa. Sementara itu, perlu menyalin dan mengganti nama cadangan.
batal