Saya mencari cara (lebih baik terminal) untuk mengatur lebih dari 1000 font dengan huruf pertama mereka.
Pada dasarnya buat direktori A-Z, #
lalu pindahkan file font ke direktori tersebut berdasarkan karakter pertama nama filenya. Font yang dimulai dengan angka [0-9] atau karakter khusus lainnya untuk dipindahkan ke #
direktori.
command-line
files
Parto
sumber
sumber
Jawaban:
Opsi python terlambat:
Cara Penggunaan
move_files.py
Jalankan dengan direktori sebagai argumen:
Script hanya akan membuat direktori (sub) (-ies) (huruf besar) jika benar-benar diperlukan
Penjelasan
Naskah:
daftar file, dapatkan karakter pertama (mendefinisikan sourcepath):
memeriksa apakah item tersebut adalah file:
mendefinisikan folder yang ditargetkan untuk apakah char pertama adalah alpha atau tidak:
memeriksa apakah folder sudah ada atau tidak, buat jika tidak:
memindahkan item ke folder terkait:
sumber
Code-golfed namun dapat dibaca hanya dengan dua perintah dan dua ekspresi reguler:
Jika Anda memiliki sejumlah besar file untuk dipindahkan, terlalu banyak untuk masuk ke dalam daftar argumen proses (ya, ada batasnya dan mungkin hanya beberapa kilobyte), Anda dapat membuat daftar file dengan perintah dan pipa yang berbeda untuk
prename
, misalnya:Ini memiliki manfaat tambahan karena tidak mencoba untuk memindahkan nama file literal
[[:alnum:]]?*
jika tidak ada file yang cocok dengan pola glob.find
juga memungkinkan lebih banyak kriteria kecocokan daripada shell globbing. Alternatifnya adalah dengan mengaturnullglob
opsi shell dan menutup aliran input standarprename
. 1Dalam kedua kasus, hapus
-n
saklar untuk benar-benar memindahkan file dan tidak hanya menunjukkan bagaimana mereka akan dipindahkan.Tambahan: Anda dapat menghapus direktori kosong lagi dengan:
1
shopt -s nullglob; prename ... <&-
sumber
Jika Anda tidak keberatan zsh, fungsi dan beberapa
zmv
perintah:The
mmv
Fungsi membuat direktori dan bergerak file.zmv
kemudian memberikan pencocokan pola dan substitusi. Pertama, memindahkan nama file dimulai dengan alfabet, lalu yang lainnya:Jalankan lagi tanpa
echo
dimmv
definisi 's untuk benar-benar melakukan langkah itu.sumber
Saya tidak menemukan cara yang bagus untuk membuat nama direktori menjadi huruf besar (atau memindahkan file dengan huruf besar), meskipun Anda dapat melakukannya setelah itu dengan
rename
...atau lebih mudah dibaca:
Hapus
echo
setelah pengujian untuk benar-benar memindahkan fileLalu
hapus
-n
jika terlihat bagus setelah pengujian dan jalankan lagi.sumber
if [[ -d "${i^}" ]]
untuk membuati
modal variabel , danmkdir {A..Z}
di awal.Perintah berikut dalam direktori yang berisi font harus berfungsi, jika Anda ingin menggunakan dari luar direktori penyimpanan font, ubah
for f in ./*
kefor f in /directory/containing/fonts/*
. Ini adalah metode yang sangat berbasis shell, jadi sangat lambat, dan juga non-rekursif. Ini hanya akan membuat direktori, jika ada file yang dimulai dengan karakter yang cocok.Sebagai satu liner, sekali lagi dari dalam direktori penyimpanan font:
Metode menggunakan find, dengan manipulasi string yang serupa, menggunakan ekspansi parameter bash, yang akan bersifat rekursif, dan harus lebih cepat daripada versi shell murni:
Atau lebih mudah dibaca:
sumber
Petakan setiap nama file dengan nama direktori menggunakan
tr
, lalumkdir
danmv
:sumber
tr
untuk dikonversi ke huruf besar.xargs
hanya untuk meneleponbash
lagi? Bukankah lebih sederhana dan lebih mudah dibaca untuk menyalurkan outputfind
menjadi loop sementara danread
ada catatan demi catatan?while
versi loop ( bit.ly/2j2mhyb ) mungkin lebih baik.{}
substitusi jika Anda membiarkanxargs
append argumen dan kemudian merujuk ke$1
dalam shell script, misalnya:xargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. (Pikirkan yang terakhir_
!)