Untuk memindahkan file dengan nama yang sama sambil menyimpan kedua salinannya, beri setiap file yang masuk nama tujuan yang belum digunakan sebelum memindahkannya. Panduan ini membuat pintasan Mac yang menambahkan akhiran bernomor, menggunakan file teks sementara untuk menunjukkan hasilnya.

Tugasnya adalah memindahkan file biasa dari satu folder lokal ke folder lain yang mungkin sudah berisi file dengan nama yang sama. File yang sudah ada di tujuan tetap berada di tempatnya; file yang masuk akan diberi nama seperti notes (2).txt. Menyimpan keduanya berarti mempertahankan kedua file di folder tujuan setelah pemindahan—file yang masuk tidak lagi berada di folder sumbernya.

Apa yang didokumentasikan Apple tentang menyimpan kedua file?

Apple mendokumentasikan dukungan untuk menjalankan skrip shell langsung di dalam Pintasan. Halaman Pintasan publik Apple yang dikutip di sini tidak menjelaskan kebijakan bentrokan Keep Both untuk tindakan Move File. Alih-alih bergantung pada pengaturan yang tidak terdokumentasi, alur kerja ini menetapkan nama secara eksplisit di Run Shell Script. Apple menjelaskan kemampuan skrip ini dalam Mengenal Pintasan untuk macOS.

Perintah macOS yang mendasarinya memiliki perilaku terdokumentasi yang lebih terbatas: mv -n tidak menimpa file yang sudah ada. Perintah ini tidak membuat nama baru. Karena itu, pintasan ini memerlukan loop pemilihan nama file sekaligus opsi tanpa penimpaan. Keduanya merupakan fungsi terpisah, sebagaimana ditunjukkan dalam sumber manual mv(1) yang diterbitkan Apple.

Penggabungan folder di Finder juga memiliki batasan. Apple menyatakan bahwa Merge hanya muncul jika salah satu folder berisi item yang tidak ada di folder lainnya; untuk folder yang berisi versi berbeda dari file dengan nama sama, pilihannya adalah Stop atau Replace. Karena itu, penggabungan folder tidak menyediakan perilaku penamaan file bernomor yang diperlukan di sini. Lihat Mengatur file dalam folder di Mac.

Siapkan contoh nama duplikat sementara

Gunakan contoh ini dengan dua folder pada disk lokal yang sama. Contoh ini menangani file biasa yang tidak tersembunyi dan berada langsung di dalam folder sumber. Contoh ini tidak memproses subfolder secara rekursif, memindahkan alias atau tautan simbolis, atau menggabungkan paket. Jalankan satu instans saja pada satu waktu, saat tidak ada proses lain yang mengubah kedua folder.

Pintasan ini memerlukan tindakan Run Shell Script yang tersedia dan dapat dijalankan di Mac Anda. Jika tindakan itu tidak dapat dijalankan dalam pengaturan Anda, gunakan prosedur Finder di bagian selanjutnya artikel ini. Contoh di bawah tidak memerlukan perangkat lunak tambahan.

Buka Terminal dan tempelkan seluruh perintah penyiapan ini. Perintah ini membuat folder Desktop baru yang hanya berisi teks sintetis. Jika Shortcuts-name-demo sudah ada, perintah akan berhenti alih-alih menggunakan kembali isinya.

/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

Bentrok nama ini disengaja: tujuan sudah berisi notes.txt dan notes (2).txt. Pintasan yang hanya menambahkan (2) akan menemui bentrokan lain. Aturan yang tepat adalah menguji kandidat berturut-turut sampai tersedia nama yang belum digunakan.

Agar lebih mudah diperiksa, aktifkan Show all filename extensions di Finder > Settings > Advanced. Apple menjelaskan bahwa menyembunyikan ekstensi mengubah tampilannya, sedangkan mengubah ekstensi itu sendiri dapat memengaruhi aplikasi yang membuka file. Pertahankan .txt pada contoh ini. Lihat Menampilkan atau menyembunyikan ekstensi nama file di Mac.

Buat pintasan dengan penanganan bentrokan yang eksplisit

Buat pintasan menggunakan tombol tambah di Pintasan, lalu beri nama Move Files and Keep Both. Cari Run Shell Script di pustaka tindakan dan tambahkan. Apple menjelaskan cara membuat pintasan dan menambahkan tindakan dalam Membuat pintasan khusus di Mac.

Atur shell tindakan ke /bin/bash, lalu ganti skrip contohnya dengan program lengkap di bawah. Versi ini membaca dua jalur folder dari variabel di dalam skrip. Skrip ini tidak menggunakan input pintasan, item Finder yang dipilih, atau input standar, jadi pengaturan penerusan input tidak berpengaruh.

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"

Tambahkan Quick Look setelah tindakan skrip untuk memeriksa laporannya. Apple secara khusus menyarankan untuk menyisipkan Quick Look saat pengujian agar Anda dapat melihat konten yang mengalir di antara tindakan. Lihat Menguji tindakan di Pintasan pada Mac.

Laporan tersebut berisi teks yang menjelaskan pemindahan yang selesai. Laporan itu bukan daftar objek File yang dipindahkan. Jika nanti Anda memperluas pintasan, jangan perlakukan baris laporan tersebut sebagai input file. Apple menjelaskan bahwa tindakan menerima dan menghasilkan jenis konten tertentu; gunakan Show Info pada suatu tindakan untuk memeriksa input yang diterimanya dan output yang dihasilkannya. Lihat Koneksi tindakan di Pintasan pada Mac.

Bagaimana aturan penamaan mempertahankan kedua salinan?

Untuk setiap file sumber, skrip terlebih dahulu memeriksa jalur tujuan aslinya. Jika jalur itu sudah terpakai, skrip mencoba (2), lalu (3), dan berlanjut sampai menemukan kandidat yang belum digunakan. Direktori dan tautan simbolis yang sudah ada juga dianggap sebagai nama yang terpakai. Pemindahan terakhir menggunakan mv -n sebagai pemeriksaan tambahan agar tidak menimpa file, sesuai dokumentasi mv(1) Apple.

File yang masuk Yang sudah ada di tujuan Nama tujuan yang dipilih
notes.txt Tidak ada yang bernama sama 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

Ini adalah aturan penamaan program, bukan klaim tentang penamaan otomatis Finder. Hanya ekstensi terakhir yang dipisahkan: .gz tetap berada di akhir archive.tar (2).gz. File yang masuk dan sudah bernama notes (2).txt mempertahankan batang namanya, sehingga menghasilkan notes (2) (2).txt jika diperlukan. Skrip tidak menafsirkan angka yang sudah ada sebagai versi.

Program ini mengapit jalur dengan tanda kutip dan mengiterasi nama file yang diperluas oleh shell, alih-alih memecah daftar teks. Karena itu, nama yang mengandung spasi tetap diperlakukan sebagai item tunggal. Sintaksnya sengaja menggunakan Bash; biarkan /bin/bash tetap dipilih. Dasar-Dasar Skrip Shell dari Apple menjelaskan mengapa perbedaan dialek shell penting.

Jalankan contoh dan verifikasi hasilnya

Jalankan pintasan sekali, lalu periksa kedua folder di Finder. Untuk data sintetis yang disediakan, isi folder tujuan yang diharapkan adalah:

  • notes.txt, yang tetap berisi Existing synthetic notes.
  • notes (2).txt, yang tetap berisi Earlier synthetic second copy.
  • notes (3).txt, yang berisi Incoming synthetic notes.
  • readme.txt, yang berisi Synthetic readme.

Folder Incoming seharusnya kini kosong, dan laporan seharusnya diakhiri dengan Completed: 2 file(s) moved. Jika pintasan dijalankan lagi tanpa menambahkan file, laporan seharusnya menunjukkan nol pemindahan. Ini adalah hasil yang diharapkan untuk contoh tersebut; alur kerja Pintasan macOS lengkap tidak dijalankan saat artikel ini disiapkan. Ekspresi pemisahan nama file diperiksa secara terpisah menggunakan nama sintetis.

Jika pintasan berhenti, periksa kedua folder sebelum menjalankannya kembali. Setiap file dipindahkan satu per satu, jadi kesalahan pada file berikutnya tidak membatalkan pemindahan sebelumnya. Skrip memeriksa apakah sumber masih ada setelah setiap perintah, alih-alih menganggap setiap penyelesaian perintah berarti file telah dipindahkan.

Untuk kegagalan pemindahan biasa, Apple menyarankan untuk memeriksa apakah file sedang dibuka dan apakah ruang yang tersedia di tujuan mencukupi. Lihat Jika Anda tidak dapat memindahkan atau menyalin item di Mac. Nama file yang menjadi terlalu panjang setelah ditambahkan akhiran juga dapat membuat program ini gagal menyelesaikan pemindahan tersebut; program akan berhenti alih-alih memotong nama.

Pemeriksaan keberadaan dan pemindahan merupakan dua operasi terpisah. Program ini ditujukan untuk alur kerja lokal yang dijalankan secara manual satu kali, dengan folder yang tidak berubah. Program ini tidak mencadangkan kandidat nama untuk mencegah perubahan serentak. Jangan jalankan secara bersamaan dan jangan biarkan proses lain menulis ke folder contoh.

Gunakan Finder jika hanya ada beberapa bentrokan

Untuk kumpulan kecil, ganti nama file yang masuk secara eksplisit sebelum memindahkannya. Dalam contoh sintetis, periksa Collected, pilih Incoming/notes.txt, tekan Return, masukkan notes (3).txt, lalu tekan Return lagi. Apple menjelaskan prosedur penggantian nama ini dalam Mengganti nama file, folder, dan disk di Mac.

Kemudian seret file yang telah diganti namanya ke Collected pada disk yang sama. Apple menjelaskan bahwa menyeret item ke folder akan memindahkannya, menahan Option akan menyalinnya, dan menahan Command saat menyeret ke disk lain akan memindahkannya. Lihat Mengatur file dalam folder di Mac. Jika bentrokan nama lain muncul, batalkan transfer itu dan pilih nama lain yang belum digunakan.

Setelah contoh sementara berfungsi sesuai harapan di Mac Anda, cukup sesuaikan src_dir dan dst_dir untuk pasangan folder lokal lain dengan kondisi yang sama. Pertahankan loop penamaan bernomor dan pemeriksaan penyelesaian secara bersamaan: memilih nama yang belum digunakan akan mempertahankan kedua salinan di tujuan, sedangkan pemeriksaan hasil memberi tahu Anda apakah file yang masuk benar-benar dipindahkan.

Sumber