Saya memiliki ReadyNAS Duo v1 (Sparc) lama yang menjalankan rasa Linux yang tidak diketahui.
Saya memiliki struktur folder dengan 1.000+ file yang ingin saya pindahkan ke dalam struktur folder berdasarkan huruf pertama nama file (tidak peka huruf besar/kecil).
Idealnya saya ingin struktur file terlihat seperti ini:
myfiles-+
+-A
+ Apple.txt
+ avocado.txt
+-B
+ Banana.txt
+ broccoli.txt
etc. etc.
Saya memiliki Google tetapi hanya menemukan alat GUI.
Bisakah ini dilakukan melalui baris perintah atau skrip?
Jawaban yang Diterima:
Inilah sedikit dari satu liner yang akan melakukan apa yang Anda inginkan:
$ mkdir -p output/{A..Z}; for i in tstdir/*; do export FILE=$(basename "$i"); LTR=$(echo" ${FILE:0:1}" | tr [a-z] [A-Z]); mv "$i" "output/$LTR/$FILE" ; done
Berikut perintah yang sama dalam bentuk yang diperluas sehingga Anda dapat melihat apa yang terjadi:
$ mkdir -p output/{A..Z}
$ for i in tstdir/*; do
FILE=$(basename "$i")
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
mv "$i" "output/$LTR/$FILE"
done
Detail
Yang pertama di atas mengasumsikan bahwa direktori keluaran hanya huruf tidak ada dan akan membuatnya,
$ mkdir -p output/{A..Z}
for
loop bekerja sebagai berikut, mengulang semua file di tstdir/*
. Kemudian menentukan basename
jalur ini, dan menyimpannya dalam variabel, $FILE
. Setiap iterasi melalui loop disimpan dalam variabel $i
.
FILE=$(basename "$i")
Kami kemudian menggunakan kemampuan Bashes untuk mengembalikan karakter pertama dari variabel bernama, $FILE
, lalu gunakan tr
untuk mengonversi semua karakter huruf kecil menjadi huruf besar.
LTR=$(echo "${FILE:0:1}" | tr [a-z] [A-Z])
Menguraikan ini sedikit lagi:
$ echo "${FILE:0:1}"
s
$ echo "${FILE:0:1}"
T
Dengan tr
kode Anda sekarang dapat melihat apa yang terjadi:
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
S
$ echo "${FILE:0:1}" | tr [a-z] [A-Z]
T
Perintah selanjutnya hanya memindahkan file ke direktori huruf pertama yang sesuai.
Contoh
Katakanlah kita memiliki direktori file ini:
$ touch {a-z}file {A-Z}file
$ tree tstdir/ | head -10
tstdir/
|-- afile
|-- Afile
|-- bfile
|-- Bfile
|-- cfile
|-- Cfile
|-- dfile
|-- Dfile
|-- efile
...
Setelah menjalankan satu liner:
$ tree output/ | head -10
output/
|-- A
| |-- afile
| `-- Afile
|-- B
| |-- bfile
| `-- Bfile
|-- C
| |-- cfile
| `-- Cfile
...