Untuk mengalihkan fail yang mempunyai nama sama sambil mengekalkan kedua-dua salinan, berikan setiap fail masuk nama destinasi yang belum digunakan sebelum mengalihkannya. Panduan ini membina pintasan Mac yang menambahkan akhiran bernombor, menggunakan fail teks sementara untuk menunjukkan hasilnya.

Tugas ini ialah mengalihkan fail biasa daripada satu folder setempat ke folder lain yang mungkin sudah mengandungi nama yang sama. Fail sedia ada di destinasi kekal di tempatnya; fail masuk menerima nama seperti notes (2).txt. Mengekalkan kedua-duanya bermaksud menyimpan kedua-dua fail di destinasi selepas pemindahan—fail masuk tidak lagi berada dalam folder sumbernya.

Apakah yang didokumenkan oleh Apple tentang mengekalkan kedua-dua fail?

Apple mendokumenkan sokongan untuk menjalankan skrip shell secara langsung dalam Pintasan. Halaman Pintasan awam Apple yang dirujuk di sini tidak menyatakan dasar pertembungan Keep Both untuk tindakan Move File. Daripada bergantung pada tetapan yang tidak didokumenkan, aliran kerja ini menetapkan keputusan penamaan secara jelas dalam Run Shell Script. Apple menerangkan keupayaan penskripan ini dalam Kenali Pintasan untuk macOS.

Arahan macOS yang mendasarinya mempunyai tingkah laku terdokumen yang lebih terhad: mv -n tidak menulis ganti fail sedia ada. Arahan itu tidak menjana nama baharu. Oleh itu, pintasan ini memerlukan gelung pemilihan nama fail dan pilihan untuk tidak menulis ganti. Kedua-duanya ialah tanggungjawab yang berasingan, seperti yang ditunjukkan dalam sumber manual mv(1) terbitan Apple.

Penggabungan folder dalam Finder juga ada batasnya. Apple menyatakan bahawa Merge hanya muncul apabila satu folder mengandungi item yang tiada dalam folder yang satu lagi; folder yang mengandungi versi berbeza bagi fail bernama sama menawarkan pilihan Stop atau Replace. Oleh itu, penggabungan folder tidak menyediakan tingkah laku penomboran fail yang diperlukan di sini. Lihat Susun fail dalam folder pada Mac.

Sediakan contoh nama pendua sementara

Gunakan contoh ini dengan dua folder pada cakera setempat yang sama. Contoh ini mengendalikan fail biasa yang tidak tersembunyi dan berada terus di dalam folder sumber. Contoh ini tidak memproses subfolder secara rekursif, mengalihkan alias atau pautan simbolik, ataupun menggabungkan pakej. Jalankan satu contoh pada satu masa, tanpa sebarang proses lain mengubah kedua-dua folder.

Pintasan ini memerlukan Run Shell Script tersedia dan boleh dijalankan pada Mac anda. Jika tindakan itu tidak dapat dijalankan dalam persediaan anda, gunakan prosedur Finder kemudian dalam artikel ini. Contoh di bawah tidak memerlukan perisian tambahan.

Buka Terminal dan tampalkan arahan persediaan lengkap ini. Arahan ini mencipta folder Desktop baharu yang hanya mengandungi teks sintetik. Jika Shortcuts-name-demo sudah wujud, arahan ini berhenti dan tidak menggunakan semula kandungannya.

/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

Pertembungan nama ini disengajakan: destinasi sudah mengandungi notes.txt dan notes (2).txt. Pintasan yang sekadar menambahkan (2) akan menghadapi pertembungan nama yang lain. Peraturan yang berguna ialah menguji calon nama satu demi satu sehingga nama yang tersedia ditemui.

Untuk memudahkan pemeriksaan, aktifkan Show all filename extensions di bawah Finder > Settings > Advanced. Apple menerangkan bahawa menyembunyikan sambungan mengubah paparannya, manakala mengubah sambungan itu sendiri boleh menjejaskan aplikasi yang membuka fail tersebut. Kekalkan .txt dalam contoh ini. Lihat Tunjukkan atau sembunyikan sambungan nama fail pada Mac.

Bina pintasan dengan pengendalian pertembungan nama yang jelas

Cipta pintasan menggunakan butang tambah dalam Pintasan dan namakannya Move Files and Keep Both. Cari Run Shell Script dalam pustaka tindakan dan tambahkannya. Apple mendokumenkan cara mencipta pintasan dan menambah tindakan dalam Cipta pintasan tersuai pada Mac.

Tetapkan shell tindakan kepada /bin/bash, kemudian gantikan skrip contohnya dengan program lengkap di bawah. Versi ini membaca dua laluan folder daripada pemboleh ubah dalam skrip. Versi ini tidak menggunakan input pintasan, item Finder yang dipilih atau input standard, jadi tetapan penghantaran input tidak mempengaruhi hasilnya.

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 selepas tindakan skrip untuk memeriksa laporannya. Apple secara khusus mengesyorkan memasukkan Quick Look semasa menguji bagi melihat kandungan yang mengalir antara tindakan. Lihat Menguji tindakan anda dalam Pintasan pada Mac.

Laporan ini mengandungi teks yang menerangkan pemindahan yang selesai. Laporan ini bukan senarai objek File yang dipindahkan. Jika anda mengembangkan pintasan ini kemudian, jangan anggap baris laporan itu sebagai input fail. Apple mendokumenkan bahawa tindakan menerima dan menghasilkan jenis kandungan tertentu; gunakan Show Info pada tindakan untuk memeriksa input yang diterima dan output yang dihasilkan. Lihat Sambungan tindakan dalam Pintasan pada Mac.

Bagaimanakah peraturan penamaan mengekalkan kedua-dua salinan?

Bagi setiap fail sumber, skrip mula-mula memeriksa laluan destinasi asal. Jika laluan itu sudah digunakan, skrip mencuba (2), kemudian (3), dan meneruskan sehingga menemui calon nama yang belum digunakan. Direktori dan pautan simbolik sedia ada juga dianggap sebagai nama yang sudah digunakan. Pemindahan akhir menggunakan mv -n sebagai semakan tambahan untuk tidak menulis ganti, berdasarkan dokumentasi mv(1) Apple.

Fail masuk Kandungan sedia ada di destinasi Nama destinasi yang dipilih
notes.txt Tiada yang bernama begitu 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

Inilah peraturan penamaan program tersebut, bukannya dakwaan tentang penamaan automatik Finder. Hanya sambungan terakhir yang dipisahkan: .gz kekal di hujung archive.tar (2).gz. Fail masuk yang sudah bernama notes (2).txt mengekalkan akar nama itu dan menghasilkan notes (2) (2).txt jika perlu. Skrip ini tidak mentafsir nombor sedia ada sebagai versi.

Program ini memetik laluan dan mengulangi nama fail yang dikembangkan oleh shell, bukannya memecahkan senarai teks. Oleh itu, nama yang mengandungi ruang kekal sebagai item tunggal. Sintaksnya sengaja menggunakan Bash; kekalkan /bin/bash sebagai pilihan. Asas Skrip Shell Apple menerangkan sebab perbezaan dialek shell penting.

Jalankan contoh dan sahkan hasilnya

Jalankan pintasan itu sekali, kemudian periksa kedua-dua folder dalam Finder. Bagi data sintetik yang disediakan, kandungan destinasi yang dijangka ialah:

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

Folder Incoming sepatutnya kosong sekarang, dan laporan sepatutnya berakhir dengan Completed: 2 file(s) moved. Jika pintasan dijalankan sekali lagi tanpa menambah fail, laporan sepatutnya menunjukkan sifar pemindahan. Inilah hasil yang dijangka bagi contoh ini; aliran kerja Pintasan macOS penuh tidak dijalankan semasa penyediaan artikel ini. Ungkapan pemecahan nama fail disemak secara berasingan menggunakan nama sintetik.

Jika pintasan terhenti, periksa kedua-dua folder sebelum menjalankannya semula. Setiap fail dipindahkan satu demi satu, jadi ralat pada fail kemudian tidak membatalkan pemindahan terdahulu. Skrip menyemak sama ada sumber masih wujud selepas setiap arahan, bukannya menganggap setiap arahan yang selesai bermakna fail telah dipindahkan.

Bagi kegagalan pemindahan biasa, Apple mengesyorkan supaya anda memeriksa sama ada fail itu sedang dibuka dan sama ada destinasi mempunyai ruang yang mencukupi. Lihat Jika anda tidak dapat mengalihkan atau menyalin item pada Mac. Nama fail yang menjadi terlalu panjang selepas penambahan akhiran juga boleh menghalang program ini daripada menyelesaikan pemindahan tersebut; program ini berhenti dan tidak memendekkan nama.

Semakan kewujudan dan pemindahan ialah dua operasi yang berasingan. Program ini bertujuan untuk aliran kerja setempat yang dijalankan secara manual dan sekali gus, dengan folder yang tidak berubah. Program ini tidak mengunci nama calon daripada perubahan serentak. Elakkan berbilang jalankan serentak dan proses lain yang menulis ke folder contoh.

Gunakan Finder jika hanya terdapat beberapa pertembungan nama

Untuk kelompok kecil, namakan semula fail masuk secara jelas sebelum mengalihkannya. Dalam contoh sintetik, periksa Collected, pilih Incoming/notes.txt, tekan Return, masukkan notes (3).txt, kemudian tekan Return sekali lagi. Apple mendokumenkan prosedur penamaan semula ini dalam Namakan semula fail, folder dan cakera pada Mac.

Kemudian seret fail yang telah dinamakan semula ke dalam Collected pada cakera yang sama. Apple mendokumenkan bahawa menyeret item ke dalam folder akan mengalihkannya, menahan Option akan menyalinnya, dan menahan Command semasa menyeret ke cakera lain akan mengalihkannya. Lihat Susun fail dalam folder pada Mac. Jika pertembungan nama lain berlaku, batalkan pemindahan itu dan pilih nama lain yang belum digunakan.

Setelah contoh sementara itu berfungsi seperti yang dijangka pada Mac anda, ubah hanya src_dir dan dst_dir untuk pasangan folder setempat yang lain dengan keadaan yang sama. Kekalkan gelung nama bernombor dan semakan penyelesaian bersama-sama: memilih nama yang belum digunakan mengekalkan kedua-dua salinan di destinasi, manakala menyemak hasilnya memberitahu anda sama ada fail masuk benar-benar telah dipindahkan.

Sumber