Yinelenen dosya adlarına sahip dosyaları tek bir dizine nasıl kopyalayabilirim ve her iki dosyayı da otomatik olarak yeniden adlandırarak nasıl saklayabilirim?


11

Windows işletim sisteminde, bir dosyayı zaten bu ada sahip bir dizine kopyaladığınızda, şunları yapmak isteyip istemediğinizi sorar:

  1. dosyayı kopyalayın ve mevcut dosyayı değiştirin / üzerine yazın
  2. yeni dosyayı dizine kopyalamayı iptal et
  3. dosyayı kopyalayın, ancak yeniden adlandırın ("dosyaadı - kopyala (1)" gibi)

Bunu Ubuntu'da yaptığımda, bu 3. seçeneğe sahip değilim (birçok kez çok kullanışlı bir seçenektir). Ubuntu'da bunu yapmanın bir yolu var mı?

Yanıtlar:


17

Ne yazık ki Nautilus'un bu seçeneği yok.

Seçenek 1: Farklı bir dosya yöneticisi

Dolphin gibi başka bir dosya yöneticisini deneyebilirsiniz .

Dolphin'i yükleyin( Evren deposunu gerektirir )

2. Seçenek: Komut satırı

Komut satırı programını cp(1)yedekleme seçeneğiyle de kullanabilirsiniz :

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

Bunun, aşağıdaki manuel kılavuzda açıklanan diğer seçeneklerle kontrol edilebilen aşağıdaki etkileri vardır cp(1):

--backup[=CONTROL] - mevcut her hedef dosyanın yedeğini alın

-b- --backupbir argümanı beğenir ancak kabul etmez

-S, --suffix=SUFFIX- normal yedekleme sonekini geçersiz kıl

Veya ~ile ayarlanmadığı sürece yedekleme soneki . Sürüm kontrol yöntemi, seçenek veya ortam değişkeni yoluyla seçilebilir . İşte değerler:--suffixSIMPLE_BACKUP_SUFFIX--backupVERSION_CONTROL

  • none, off: asla yedek yapmayın (verilse bile --backup)
  • numbered, t: numaralı yedeklemeler yap
  • existing, nil: numaralı yedeklemeler varsa numaralandırılır, aksi takdirde basit
  • simple, never: her zaman basit yedeklemeler yapın

Misal

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

Bu tüm dosyaları kopyalar ~/Musiciçin ~/Videos. Hedefte aynı adlı bir dosya varsa .orig, adına yedek olarak eklenerek yeniden adlandırılır . Yedekle aynı ada sahip bir dosya varsa, yedekleme bunun yerine eklenerek yeniden adlandırılır .1ve eğer varsa .2ve böyle devam eder. Ancak bundan sonra kaynak dosya hedefe kopyalanır.

Alt dizinlerdeki dosyaları tekrar tekrar kullanmak istiyorsanız:

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

Farklı bir dosya yöneticisi kullanma önerisi için teşekkür ederiz. Ne yazık ki, Thunar'ın bahsettiğim seçeneği de yok. Şunlara sahiptir: İptal, Tümünü Atla, Atla, Değiştir, Tümünü Değiştir. Dolphin'i deneyecek.
heisenbergman

1
Dolphin bunun için harika çalışıyor :)
heisenbergman

İkisini denediğiniz için teşekkürler. Sorumu bulgularınıza göre güncelleyeceğim.
David Foerster

@heisenbergman, Selam Dolphin ile bunun için harika ne demek istedin? Yeniden adlandırma seçeneği sunuyor, ancak yine de dosyaları tek tek yeniden adlandırmamı sağlıyor. Ne yazık ki "herkese uygula" seçeneği yeniden adlandırma seçeneğiyle kullanılamaz. Bu, büyük miktarda dosya için oldukça işe yaramaz. Bu sadece benim versiyonum mu? Dolphin'i kullanarak tüm çiftlerinizi bir kerede (Windows'ta olduğu gibi) yeniden adlandırmayı başardınız mı?
Kvothe

1
@ n1k31t4 Lütfen --backup=existingtekrar açıklamasını okuyun . İpucu: Aşağıdaki durumda ne olur touch foo bar; cp -v --backup=numbered foo bar; cp -v --backup=existing foo bar?
David Foerster

2

Bunu süper kullanıcıda buldum :

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

Aynı ada sahip dosya, dosyaya md5sum eklenmiş olarak yeniden adlandırılır. Dosyayı "saveCopy" gibi bir dosya adına kaydederseniz find, yürütmek için şu şekilde kullanabilirsiniz :

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

Bununla ilgili daha fazla bilgi için bağlantıya bakın.



0

Bu komut dosyasını en üst dizine kopyalayın, yürütülebilir yapın ve çalıştırın:

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.