Saya memiliki direktori yang diisi dengan berbagai file, yang dinamai berbeda (yaitu tidak dinamai dengan pola tertentu) dan dengan ekstensi yang berbeda, dan saya ingin meletakkan setiap file dalam subdirektori yang baru dibuat dinamai setiap file; apa cara terbaik untuk mencapainya dari baris perintah di Linux?
Ini kedengarannya agak membingungkan, izinkan saya membuat dan contoh: mari kita memanggil file acak di direktori ./filename.ext
, saya ingin meletakkannya di subdirektori yang disebut ./filename
sehingga secara efektif jalan baru akan ./filename/filename.ext
.
Saya melakukan beberapa percobaan dengan langkah-langkah berikut:
- Saya telah membuat beberapa file uji, dari
file-1.txt
hinggafile-9.txt
, di dalam direktori pengujian denganfor num in {1..9}; do touch file-$num.txt; done
- Saya telah membuat direktori bernama setelah setiap nama file dengan
for name in $(eval ls | cut -b 1-6); do mkdir $name; done
- Saya telah memindahkan file sumber di direktori masing-masing
for name in $(eval ls | grep -e ".txt" | cut -b 1-6); do mv $name.txt $name/$name.txt; done
Seperti yang Anda lihat, solusi ini berfungsi, tetapi kelemahannya adalah ia berfungsi hanya dalam kasus ini, dengan file dengan nama file yang panjang dan dengan ekstensi tertentu. Jika saya memiliki beberapa file dengan nama dan ekstensi yang berbeda, ini tidak akan berguna sama sekali. Penggunaan cut
perintah bukanlah solusi yang ideal di sini, saya kira, tetapi saya belum menemukan sesuatu yang lebih baik saat ini.
Sebagai bonus, akan lebih baik untuk menemukan cara untuk membuat subdir secara otomatis ketika memindahkan / mengganti nama file, tanpa harus menggunakan mkdir
sebelumnya (jadi ketika saya ls
benar-benar mengganti nama, saya tidak perlu khawatir mengecualikan direktori yang baru dibuat. ); tetapi pada akhirnya ini adalah masalah sekunder.
sumber
Berikut ini adalah pendekatan dengan skrip shell lebih sedikit, tetapi lebih banyak perintah.
Temukan semua file di direktori saat ini dan simpan daftar ini.
Saring daftar ini untuk hanya menyertakan nama file yang memiliki titik di suatu tempat. Hapus titik terakhir ini dengan sed, simpan daftar ini.
Buat semua folder.
Ini untuk mengatur (berdasarkan pesanan) nama file dengan nama folder>
Ini akan terlihat salah karena daftar file file akan ada di sini. Dalam kasus saya ada juga file yang disebut acak . Hapus nama-nama itu dari daftar file.
Selidiki output dari perintah berikut ini sekali lagi: tempel daftar file-daftar-dir
Seharusnya terlihat seperti ini:
Setelah terlihat benar, buat skrip shell dari daftar dan berikan matahari:
sumber