Yinelenen adlara sahip dosyaları her iki kopyayı da koruyarak taşımak için, gelen her dosyaya taşımadan önce hedefte kullanılmayan bir ad verin. Bu kılavuz, sonucu göstermek için geçici metin dosyaları kullanarak numaralı son ekler ekleyen bir Mac kestirmesi oluşturur.
Bu işlem, sıradan dosyaları bir yerel klasörden, aynı adları içeren dosyaların zaten bulunabileceği başka bir klasöre taşımaktır. Hedefteki mevcut dosyalar yerinde kalır; gelen dosyalara notes (2).txt gibi adlar verilir. İkisini de saklamak, taşıma işleminden sonra her iki dosyanın da hedefte tutulması demektir; gelen dosya artık kaynak klasöründe kalmaz.
Apple, her iki dosyanın da saklanması hakkında ne belgeliyor?
Apple, kabuk betiklerinin doğrudan Kestirmeler içinde çalıştırılmasını desteklediğini belgeliyor. Burada kaynak gösterilen Apple’ın herkese açık Kestirmeler sayfaları, Move File eylemi için bir Keep Both çakışma ilkesini belirtmiyor. Belgelenmemiş bir ayara bağlı kalmak yerine, bu iş akışı adlandırma kararını Run Shell Script içinde açıkça verir. Apple, bu betik özelliğini macOS için Kestirmeler ile tanışın sayfasında açıklıyor.
Temeldeki macOS komutunun belgelenmiş davranışı daha sınırlıdır: mv -n mevcut bir dosyanın üzerine yazmaz. Yeni bir ad oluşturmaz. Bu nedenle bu kestirmenin hem dosya adı seçme döngüsüne hem de üzerine yazmayı önleyen seçeneğe ihtiyacı vardır. Apple’ın yayımladığı mv(1) kılavuz kaynağında gösterildiği gibi bunlar ayrı işlevlerdir.
Finder’da klasör birleştirmenin de sınırları vardır. Apple’a göre Merge yalnızca klasörlerden birinde diğerinde bulunmayan öğeler varsa görünür; aynı adlı dosyaların farklı sürümlerini içeren klasörlerde ise Stop veya Replace seçenekleri sunulur. Bu nedenle klasör birleştirme, burada gereken numaralı dosya davranışını sağlamaz. Mac’teki klasörlerde dosyaları düzenleme sayfasına bakın.
Yinelenen adlar için geçici bir örnek hazırlayın
Bu örneği aynı yerel diskteki iki klasörle kullanın. Kaynak klasörün hemen içindeki sıradan, gizli olmayan dosyaları işler. Alt klasörleri özyinelemeli olarak işlemez, takma adları veya sembolik bağlantıları taşımaz ya da paketleri birleştirmez. Her seferinde tek bir örnek çalıştırın ve başka hiçbir işlemin klasörleri değiştirmediğinden emin olun.
Kestirme, Mac’inizde Run Shell Script eyleminin kullanılabilir ve çalıştırılabilir olmasını gerektirir. Kurulumunuzda bu eylem çalışmıyorsa, bu makalenin ilerleyen bölümlerindeki Finder yöntemini kullanın. Aşağıdaki örnekler ek yazılım gerektirmez.
Terminal’i açın ve bu kurulum komutunun tamamını yapıştırın. Masaüstünde yalnızca sentetik metin içeren yeni bir klasör oluşturur. Shortcuts-name-demo zaten varsa, komut içeriğini yeniden kullanmak yerine durur.
/bin/bash <<'BASH'
set -e
root="$HOME/Desktop/Shortcuts-name-demo"
/bin/mkdir "$root"
/bin/mkdir "$root/Incoming" "$root/Collected"
printf '%s\n' 'Incoming synthetic notes.' > "$root/Incoming/notes.txt"
printf '%s\n' 'Existing synthetic notes.' > "$root/Collected/notes.txt"
printf '%s\n' 'Earlier synthetic second copy.' > "$root/Collected/notes (2).txt"
printf '%s\n' 'Synthetic readme.' > "$root/Incoming/readme.txt"
printf 'Example folder: %s\n' "$root"
BASH
Çakışma kasıtlıdır: hedefte hem notes.txt hem de notes (2).txt zaten bulunur. Yalnızca (2) ekleyen bir kestirme başka bir çakışmayla karşılaşır. İşe yarayan karar kuralı, kullanılabilir bir ad bulana kadar ardışık adayları denemektir.
Dosyaları daha kolay incelemek için Finder > Settings > Advanced bölümünde Show all filename extensions seçeneğini etkinleştirin. Apple, bir uzantıyı gizlemenin yalnızca görüntülenme biçimini değiştirdiğini, uzantının kendisini değiştirmenin ise dosyayı hangi uygulamanın açacağını etkileyebileceğini açıklıyor. Bu örnekte .txt uzantısını koruyun. Mac’te dosya adı uzantılarını gösterme veya gizleme sayfasına bakın.
Çakışmaları açıkça ele alan kestirmeyi oluşturun
Kestirmeler’de ekleme düğmesini kullanarak bir kestirme oluşturun ve adını Move Files and Keep Both koyun. Eylem kitaplığında Run Shell Script öğesini bulup ekleyin. Apple, kestirme oluşturmayı ve eylem eklemeyi Mac’te özel kestirme oluşturma sayfasında belgeliyor.
Eylemin kabuğunu /bin/bash olarak ayarlayın, ardından örnek betiğini aşağıdaki programın tamamıyla değiştirin. Bu sürüm, iki klasör yolunu betikteki değişkenlerden okur. Kestirme girdisini, Finder’da seçili öğeleri veya standart girişi kullanmadığından, girdi aktarımı ayarının önemi yoktur.
set -e
shopt -s nullglob
src_dir="$HOME/Desktop/Shortcuts-name-demo/Incoming"
dst_dir="$HOME/Desktop/Shortcuts-name-demo/Collected"
fail() {
printf '%s\n' "$1" >&2
exit 1
}
[[ -d "$src_dir" ]] || fail "Source folder does not exist."
[[ -d "$dst_dir" ]] || fail "Destination folder does not exist."
src_dir=$(cd "$src_dir" && pwd -P)
dst_dir=$(cd "$dst_dir" && pwd -P)
[[ "$src_dir" != "$dst_dir" ]] || fail "Choose different folders."
moved=0
for src in "$src_dir"/*; do
if [[ -L "$src" || ! -f "$src" ]]; then
printf 'Skipped non-regular item: %s\n' "$src" >&2
continue
fi
name=${src##*/}
stem=$name
ext=
if [[ "$name" == *.* && "$name" != .* && "$name" != *. ]]; then
stem=${name%.*}
ext=.${name##*.}
fi
target="$dst_dir/$name"
number=2
while [[ -e "$target" || -L "$target" ]]; do
target="$dst_dir/$stem ($number)$ext"
number=$((number + 1))
done
/bin/mv -n "$src" "$target" || fail "Move failed: $src"
if [[ -e "$src" || -L "$src" || ! -f "$target" ]]; then
fail "Move was not completed as expected: $src"
fi
moved=$((moved + 1))
printf 'Moved: %s -> %s\n' "$name" "${target##*/}"
done
printf 'Completed: %s file(s) moved.\n' "$moved"
Raporunu incelemek için betik eyleminden sonra Quick Look ekleyin. Apple, eylemler arasında hangi içeriğin aktarıldığını görmek için test sırasında özellikle Quick Look eklenmesini öneriyor. Mac’te Kestirmeler’de eylemlerinizi test etme sayfasına bakın.
Rapor, tamamlanan taşımaları açıklayan metin içerir. Taşınan File nesnelerinin listesi değildir. Kestirmeyi daha sonra genişletirseniz bu rapor satırlarını dosya girdisi olarak kullanmayın. Apple, eylemlerin belirli içerik türlerini kabul edip ürettiğini belgeliyor; kabul edilen girdiyi ve sonuç çıktısını incelemek için bir eylemde Show Info seçeneğini kullanın. Mac’te Kestirmeler’de eylem bağlantıları sayfasına bakın.
Adlandırma kuralı her iki kopyayı nasıl korur?
Betik her kaynak dosyası için önce hedefte özgün dosya yolunu kontrol eder. Bu yol doluysa (2) adını, ardından (3) adını dener ve kullanılmayan bir aday bulana kadar devam eder. Mevcut dizinler ve sembolik bağlantılar da dolu ad sayılır. Son taşıma işlemi, ek bir üzerine yazmama kontrolü olarak mv -n kullanır; bu, Apple’ın mv(1) belgelerini izler.
| Gelen dosya | Hedefte zaten bulunan | Seçilen hedef adı |
|---|---|---|
notes.txt |
Bu adda bir şey yok | notes.txt |
notes.txt |
notes.txt |
notes (2).txt |
notes.txt |
notes.txt, notes (2).txt |
notes (3).txt |
readme |
readme |
readme (2) |
archive.tar.gz |
archive.tar.gz |
archive.tar (2).gz |
Bunlar, Finder’ın otomatik adlandırması hakkında bir iddia değil, programın adlandırma kurallarıdır. Yalnızca son uzantı ayrılır: .gz, archive.tar (2).gz adının sonunda kalır. Gelen dosyanın adı zaten notes (2).txt ise kök adını korur ve gerekirse notes (2) (2).txt adını alır. Betik, mevcut bir sayıyı sürüm numarası olarak yorumlamaz.
Program yolları tırnak içine alır ve metin listesini parçalara ayırmak yerine kabuk tarafından genişletilmiş dosya adları üzerinde döngü kurar. Böylece boşluk içeren adlar tek öğe olarak kalır. Sözdizimi özellikle Bash kullanır; /bin/bash seçili kalsın. Apple’ın Kabuk Betiği Temelleri sayfası, kabuk lehçeleri arasındaki farkların neden önemli olduğunu açıklar.
Örneği çalıştırın ve sonucu doğrulayın
Kestirmeyi bir kez çalıştırın, ardından Finder’da her iki klasörü de inceleyin. Sağlanan sentetik veriler için hedefte beklenen içerik şöyledir:
notes.txt; içinde hâlâExisting synthetic notes.bulunur.notes (2).txt; içinde hâlâEarlier synthetic second copy.bulunur.notes (3).txt; içindeIncoming synthetic notes.bulunur.readme.txt; içindeSynthetic readme.bulunur.
Incoming klasörü artık boş olmalı ve rapor Completed: 2 file(s) moved. ile bitmelidir. Dosya eklemeden kestirmeyi yeniden çalıştırırsanız sıfır taşıma bildirimi vermelidir. Bunlar örnek için beklenen sonuçlardır; makalenin hazırlanması sırasında macOS Kestirmeler iş akışının tamamı çalıştırılmadı. Dosya adı ayırma ifadeleri sentetik adlarla ayrıca kontrol edildi.
Kestirme durursa yeniden çalıştırmadan önce iki klasörü de inceleyin. Her dosya ayrı ayrı taşındığından, sonraki bir dosyada oluşan hata önceki taşımaları geri almaz. Betik, her komuttan sonra dosyanın kaynakta kalıp kalmadığını kontrol eder; komutun tamamlanmasının dosyanın taşındığı anlamına geldiğini varsaymaz.
Sıradan bir taşıma hatasında Apple, dosyanın açık olup olmadığını ve hedefte yeterli boş alan bulunup bulunmadığını kontrol etmenizi öneriyor. Mac’te bir öğeyi taşıyamıyor veya kopyalayamıyorsanız sayfasına bakın. Son ek eklendiğinde dosya adı fazla uzarsa bu programın taşımayı tamamlaması da engellenebilir; betik adı kısaltmak yerine durur.
Dosyanın var olup olmadığını denetleme ile taşıma ayrı işlemlerdir. Bu program, klasörlerin sabit kaldığı, tek seferde elle çalıştırılan yerel bir iş akışı için tasarlanmıştır. Aday adları eşzamanlı değişikliklere karşı ayırmaz. Örnekteki klasörlerde eşzamanlı çalıştırmalara ve başka yazma işlemlerine izin vermeyin.
Yalnızca birkaç çakışma varsa Finder’ı kullanın
Küçük bir grup dosya için gelen dosyayı taşımadan önce açıkça yeniden adlandırın. Sentetik örnekte Collected klasörünü inceleyin, Incoming/notes.txt öğesini seçin, Return tuşuna basın, notes (3).txt yazın ve yeniden Return tuşuna basın. Apple bu yeniden adlandırma yöntemini Mac’te dosya, klasör ve diskleri yeniden adlandırma sayfasında belgeliyor.
Ardından yeniden adlandırılmış dosyayı aynı diskteki Collected klasörüne sürükleyin. Apple, bir öğeyi klasöre sürükleyerek taşımayı, kopyalamak için Option tuşunu basılı tutmayı ve farklı bir diske sürüklerken taşımak için Command tuşunu basılı tutmayı belgeliyor. Mac’teki klasörlerde dosyaları düzenleme sayfasına bakın. Başka bir ad çakışması çıkarsa aktarımı iptal edin ve kullanılmayan başka bir ad seçin.
Geçici örnek Mac’inizde beklendiği gibi çalıştığında, aynı koşullara sahip başka bir yerel klasör çifti için yalnızca src_dir ve dst_dir değerlerini uyarlayın. Numaralı ad döngüsünü ve tamamlanma kontrollerini birlikte tutun: kullanılmayan bir ad seçmek hedefteki her iki kopyayı da korurken, sonucu kontrol etmek gelen dosyanın gerçekten taşınıp taşınmadığını gösterir.
Kaynaklar
- macOS için Kestirmeler ile tanışın — Apple Developer.
- mv(1) kılavuz kaynağı — Apple Open Source Distributions.
- Mac’teki klasörlerde dosyaları düzenleme — Apple Support.
- Mac’te dosya adı uzantılarını gösterme veya gizleme — Apple Support.
- Mac’te özel kestirme oluşturma — Apple Support.
- Mac’te Kestirmeler’de eylemlerinizi test etme — Apple Support.
- Mac’te Kestirmeler’de eylem bağlantıları — Apple Support.
- Kabuk Betiği Temelleri — Apple Developer.
- Mac’te bir öğeyi taşıyamıyor veya kopyalayamıyorsanız — Apple Support.
- Mac’te dosya, klasör ve diskleri yeniden adlandırma — Apple Support.