Untuk mengisih fail Muat Turun peringkat atas ke dalam folder sambungan, gunakan skrip yang memeriksa fail secara langsung, mencipta folder seperti txt dan csv, serta melangkau nama destinasi yang sedia ada. Mulakan dengan contoh sementara di bawah, pratonton pemindahannya, kemudian jalankannya dari Terminal atau Apple Shortcuts.

Panduan ini ditujukan kepada pengguna Mac yang mahu memindahkan fail terpisah secara fizikal ke dalam folder sambil membiarkan subfolder sedia ada dan kandungannya tanpa perubahan. Panduan ini menggunakan laporan pratonton sebagai alat bantu membuat keputusan: setiap fail yang layak diberikan destinasi yang dicadangkan, manakala konflik dan nama yang tidak disokong akan disertakan mesej langkau yang jelas.

Apakah yang akan dipindahkan dan apakah yang akan kekal di tempatnya?

Finder menyediakan kawalan pengisihan dan pengumpulan, serta folder dan Folder Pintar. Apple menjelaskan bahawa Folder Pintar memaparkan fail yang sepadan bersama-sama tanpa memindahkannya. Untuk tugasan ini, hasil yang diingini ialah folder sambungan sebenar yang mengandungi fail yang dipindahkan. Susun fail anda dalam Finder pada Mac.

Sebelum memeriksa contoh ini, buka Finder dan pilih Finder > Settings > Advanced, kemudian pilih Show all filename extensions. Ini menjadikan akhiran yang digunakan oleh pengisih kelihatan. Memaparkan sambungan tidak mengubah format fail. Paparkan atau sembunyikan sambungan nama fail pada Mac.

Skrip di bawah menggunakan peraturan yang ditetapkan dengan sengaja. Peraturan ini menerangkan pelaksanaan ini, bukannya tingkah laku universal Finder atau Shortcuts:

Item yang ditemui Tingkah laku pengisih
Fail biasa yang berada secara langsung seperti note.TXT Mencadangkan txt/note.TXT; mengekalkan nama fail asal
Nama berbilang sambungan seperti bundle.tar.gz Menggunakan akhiran terakhir: gz/bundle.tar.gz
Fail tanpa titik, atau yang berakhir dengan titik Membiarkannya di tempat asal dan melaporkan bahawa ia dilangkau
Folder, termasuk folder yang namanya mempunyai sambungan Membiarkan folder dan kandungannya di tempat asal
Nama yang bermula dengan titik Mengecualikannya daripada imbasan
Pautan simbolik Membiarkannya di tempat asal
Sambungan yang mengandungi aksara selain huruf dan digit ASCII, atau yang melebihi 32 aksara Membiarkannya di tempat asal dan melaporkan bahawa ia dilangkau
Destinasi sedia ada dengan nama fail yang sama Membiarkan sumber di tempat asal dan melaporkan konflik
Nama folder destinasi yang digunakan oleh fail biasa atau pautan simbolik Melaporkan folder yang terhalang dan membiarkan sumber di tempat asal

Sekatan sambungan ini memastikan peraturan penamaan folder kekal ringkas dan mudah dijangka. Fail yang dilangkau kekal tersedia untuk keputusan manual; skrip ini tidak mereka nama gantian atau membuangnya secara senyap.

Cipta contoh Muat Turun sementara

Buka Terminal dan tampal blok persediaan lengkap berikut. Blok ini hanya mencipta fail teks sintetik di dalam Downloads/ExtensionSortDemo. Sesetengah fail mempunyai sambungan ilustrasi seperti .gz; kandungannya ialah teks sampel biasa, bukannya contoh format tersebut. Persediaan ini akan berhenti jika folder demo itu sudah wujud, jadi menjalankannya semula tidak akan menetapkan semula ujian terdahulu.

Apple mendokumentasikan Terminal sebagai cara untuk melaksanakan arahan dan skrip shell, serta mendokumentasikan mv untuk memindahkan fail setempat. Dalam panduan ini, Terminal menyediakan cara yang mudah dibaca untuk pratonton setiap pemindahan yang dirancang sebelum melaksanakannya. Apakah itu Terminal pada Mac?, Urus fail dalam Terminal pada Mac.

/bin/bash <<'BASH'
set -eu
demo="$HOME/Downloads/ExtensionSortDemo"
/bin/mkdir "$demo"
/bin/mkdir "$demo/nested" "$demo/txt"
printf 'sample text\n' > "$demo/sample.txt"
printf 'uppercase suffix example\n' > "$demo/note.TXT"
printf 'name,value\nblue,1\n' > "$demo/palette.csv"
printf 'synthetic compound-name example\n' > "$demo/bundle.tar.gz"
printf 'no extension example\n' > "$demo/README"
printf 'trailing dot example\n' > "$demo/trailing."
printf 'hidden example\n' > "$demo/.hidden.txt"
printf 'nested example\n' > "$demo/nested/inside.txt"
printf 'existing destination example\n' > "$demo/txt/sample.txt"
printf 'blocks creation of a csv folder\n' > "$demo/csv"
printf 'Created demo folder: %s\n' "$demo"
BASH

Buka Muat Turun dalam Finder, kemudian buka ExtensionSortDemo. Perhatikan dua fail berlainan bernama sample.txt: satu di peringkat atas folder demo dan satu lagi yang sudah berada di dalam txt. Perhatikan juga bahawa csv ialah sebuah fail. Ini ialah ujian yang disengajakan bagi dua sebab lazim sesuatu pemindahan patut dilangkau.

Pratonton pengisih sebelum memindahkan fail

Tampal program lengkap di bawah ke dalam Terminal. Tetapan awalnya ialah mode=preview, jadi program ini melaporkan pemindahan yang dicadangkan tanpa mencipta folder sambungan atau memindahkan fail. Laluan akar yang ditetapkan ialah folder demo sementara, bukannya keseluruhan folder Muat Turun.

/bin/bash <<'BASH'
set -u
export LC_ALL=C
unset GLOBIGNORE
shopt -s nullglob
shopt -u dotglob

root="$HOME/Downloads/ExtensionSortDemo"
mode=preview

case "$mode" in
  preview|move) ;;
  *) printf 'Invalid mode\n' >&2; exit 1 ;;
esac
if [ ! -d "$root" ] || [ -L "$root" ]; then
  printf 'Root must be an existing ordinary folder\n' >&2
  exit 1
fi
for file in "$root"/*; do
  if [ -L "$file" ] || [ ! -f "$file" ]; then
    printf 'SKIP non-regular: %q\n' "$file"
    continue
  fi
  name=${file##*/}
  case "$name" in
    *.*) ext=${name##*.} ;;
    *) printf 'SKIP no extension: %q\n' "$name"; continue ;;
  esac
  case "$ext" in
    ''|*[!A-Za-z0-9]*)
      printf 'SKIP unsupported extension: %q\n' "$name"
      continue ;;
  esac
  if [ "${#ext}" -gt 32 ]; then
    printf 'SKIP long extension: %q\n' "$name"
    continue
  fi
  ext=$(printf '%s' "$ext" | /usr/bin/tr '[:upper:]' '[:lower:]')
  folder="$root/$ext"
  dest="$folder/$name"
  if [ -L "$folder" ] || { [ -e "$folder" ] && [ ! -d "$folder" ]; }; then
    printf 'SKIP blocked folder: %q\n' "$folder"
    continue
  fi
  if [ -e "$dest" ] || [ -L "$dest" ]; then
    printf 'SKIP collision: %q\n' "$dest"
    continue
  fi
  if [ "$mode" = preview ]; then
    printf 'WOULD MOVE %q -> %q\n' "$file" "$dest"
    continue
  fi
  /bin/mkdir -p "$folder" || exit 1
  /bin/mv -n "$file" "$dest" || exit 1
  if [ -e "$file" ] || [ -L "$file" ]; then
    printf 'NOT MOVED: %q\n' "$file" >&2
    exit 1
  fi
  printf 'MOVED %q -> %q\n' "$file" "$dest"
done
printf 'Finished (%s). Review all SKIP lines.\n' "$mode"
BASH

Corak anak langsung \"$root\"/* tidak menyusur ke dalam direktori. Pemeriksaan fail seterusnya mengecualikan direktori dan pautan simbolik. nullglob mengendalikan folder kosong tanpa menganggap corak yang tidak sepadan sebagai nama fail; menyahdayakan dotglob mengecualikan nama yang bermula dengan titik. Tingkah laku ini didokumentasikan dalam manual Bash yang diedarkan oleh Apple. Manual Bash.

Skrip ini mengekstrak akhiran terakhir dan menukarkan hurufnya kepada huruf kecil dengan tr. Oleh itu, note.TXT mengekalkan nama failnya tetapi dimasukkan ke dalam txt. Manual tr Apple mendokumentasikan pemetaan aksara huruf besar kepada huruf kecil yang digunakan di sini. tr(1) — terjemah aksara.

Bagi data ujian ini, hasil jangkaan yang penting ialah:

Sumber sintetik Hasil pratonton yang dijangka
note.TXT Akan dipindahkan ke txt/note.TXT
bundle.tar.gz Akan dipindahkan ke gz/bundle.tar.gz
sample.txt Konflik dengan txt/sample.txt; langkau
palette.csv Nama folder csv terhalang oleh fail; langkau
README Tiada sambungan; langkau
trailing. Sambungan kosong; langkau
nested/inside.txt Tidak akan diperiksa
.hidden.txt Tidak akan diperiksa

Ini ialah hasil sistem fail yang dijangka, bukannya dakwaan bahawa pemindahan telah dilaksanakan semasa penyediaan. Program ini lulus semakan sintaks Bash, dan semakan pemetaan nama fail deterministik yang berasingan mengesahkan pengekstrakan akhiran serta penukaran kepada huruf kecil. Persekitaran penyediaan ini baca sahaja, jadi aliran kerja pemindahan macOS yang lengkap tidak dijalankan.

Pindahkan fail contoh dan semak hasilnya

Setelah pratonton sepadan dengan jadual, tampal semula program lengkap yang sama dengan hanya mode=preview ditukar kepada mode=move. Kekalkan akar demo seperti asal untuk ujian ini.

Dalam mod pemindahan, mkdir -p mencipta folder yang diperlukan atau menggunakan direktori sedia ada. Arahan itu tidak menukar fail biasa sedia ada menjadi folder, sebab itulah skrip memeriksa folder destinasi terlebih dahulu. mkdir(1) — cipta direktori.

Pemindahan ini menggunakan mv -n macOS, yang menurut dokumentasinya tidak akan menulis ganti fail sedia ada. Pemeriksaan kewujudan terdahulu memberikan laporan konflik yang mudah dibaca; pemeriksaan sumber selepas itu mengesan jika sumber masih tertinggal. Program ini berhenti jika arahan melaporkan kegagalan. mv(1) — pindahkan fail.

Semak demo dalam Finder. Anda sepatutnya menemui note.TXT di dalam txt, dan bundle.tar.gz di dalam folder gz yang baru dicipta. Kedua-dua versi sample.txt sepatutnya masih wujud di lokasi asal masing-masing. palette.csv sepatutnya kekal di peringkat atas, dan nested/inside.txt sepatutnya kekal di dalam nested.

Baris akhir Finished bermaksud imbasan telah selesai; semak juga mesej yang menunjukkan fail dilangkau. Menjalankan pengisih sekali lagi sepatutnya membiarkan fail yang sudah diisih di dalam folder masing-masing kerana folder tersebut tidak diimbas secara rekursif.

Jalankan pengisih yang sama daripada Apple Shortcuts

Shortcuts boleh digunakan sebagai butang untuk skrip ini. Apple mendokumentasikan sokongan terbina dalam untuk menulis dan menjalankan skrip shell dalam editor Shortcuts. Program shell ini menjalankan pemetaan sambungan dan pemeriksaan kewujudan; artikel ini tidak menganggap bahawa tindakan pemindahan fail natif mempunyai tingkah laku konflik yang sama. Kenali Shortcuts untuk macOS.

Cipta pintasan secara manual dan pastikan ia ditetapkan kepada demo semasa ujian:

  1. Buka Shortcuts, klik butang tambah, dan namakan pintasan itu Sort Extension Demo.
  2. Cari Run Shell Script dalam senarai tindakan dan tambah tindakan tersebut.
  3. Tetapkan shell kepada /bin/bash. Tampal blok pengisih lengkap di atas, termasuk baris pembukaan /bin/bash dan pembatas akhir BASH, ke dalam medan skrip. Kekalkan mode=preview pada mulanya.
  4. Tambah Quick Look selepas tindakan skrip dan sambungkannya kepada output skrip.
  5. Jalankan pintasan dan periksa laporan pratonton sebelum menukar skrip kepada mode=move.

Apple mendokumentasikan cara mencipta pintasan dengan menambah tindakan dan mengujinya, serta mengesyorkan Quick Look untuk memeriksa kandungan yang dihantar antara tindakan. Cipta pintasan tersuai pada Mac, Uji tindakan anda dalam Shortcuts pada Mac.

Pintasan ini tidak memerlukan fail masuk: laluan akar ditentukan di dalam skrip. Output yang berjaya ialah laporan teks yang dipaparkan oleh Quick Look. Laporan itu bukan koleksi objek fail yang telah dipindahkan untuk dihantar ke tindakan fail lain. Untuk memeriksa input yang diterima oleh sesuatu tindakan dan output yang dihasilkannya pada versi terpasang anda, Control-klik ikonnya dan pilih Show Info, seperti yang didokumentasikan oleh Apple. Navigasi senarai tindakan dalam Shortcuts pada Mac.

Jika Shortcuts memerlukan pelaksanaan skrip didayakan, tetapan yang didokumentasikan oleh Apple ialah Shortcuts > Settings > Advanced > Allow Running Scripts. Jika tindakan shell tidak tersedia pada pemasangan anda, gunakan program Terminal lengkap di atas; program itu menjalankan tugas pengisihan yang sama secara berasingan. Tetapan privasi dan keselamatan lanjutan dalam Shortcuts pada Mac.

Gunakan peraturan ini pada Muat Turun peringkat atas

Selepas ujian sementara itu, perubahan konfigurasi untuk folder Muat Turun sebenar ialah penggantian satu baris berikut di dalam pengisih. Ini ialah cebisan konfigurasi, bukannya program pengisihan kendiri:

root="$HOME/Downloads"

Kembali kepada mode=preview setiap kali anda menukar akar. Semak setiap destinasi yang dicadangkan dan mesej langkau sebelum mendayakan pemindahan. Program ini memproses semua fail langsung yang layak sekaligus; program ini tidak menyediakan gesaan pemilihan individu.

Gunakannya sebagai proses kelompok yang dimulakan secara manual pada folder yang failnya telah selesai diterima. Skrip ini tidak menentukan sama ada muat turun telah selesai, memantau penambahan baharu pada masa depan atau menyelaraskan pelaksanaan serentak. Pemeriksaan dan pemindahannya ialah operasi berasingan, jadi elakkan aktiviti pemindahan fail lain dalam folder semasa skrip berjalan. Pratonton ialah laporan keadaan semasa, bukannya tempahan destinasi tersebut.

Jika berlaku konflik, periksa kedua-dua fail dalam Finder dan tentukan sama ada hendak menamakan semula fail peringkat atas atau membiarkannya di tempat asal. Jika folder sambungan terhalang, selesaikan dahulu item yang menggunakan nama folder tersebut sebelum menjalankan semula. Kedua-dua keadaan ini tidak memerlukan perubahan pada program untuk menulis ganti fail.

Akhir sekali, semak folder destinasi sebenar dalam Finder dan bandingkan baki fail peringkat atas dengan laporan. Contoh sementara ini memberikan ujian penerimaan yang konkrit: fail yang dimaksudkan dipindahkan, nama sedia ada kekal utuh dan kandungan bersarang kekal di tempat asalnya.

Sumber