Saya sangat baru di linux / command line dan perlu mengenkripsi nama file 10K + (nama unik) sehingga cocok dengan nama terenkripsi MD5 dalam database mySQL.
Saya telah melihat bagaimana Anda dapat mengubah nama direktori file dan cara mendapatkan hash file ( mdsum? ) Tapi saya terjebak pada bagaimana untuk mendapatkan hash dari nama file dan kemudian mengubah nama file itu menjadi hash yang dihasilkan. ekstensi yaitu
mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg
Sepertinya itu harus berupa penggantian nama atau mv
garis yang sederhana tetapi saya tidak bisa mengerti.
Terima kasih banyak atas wawasan Anda
PS Saya telah melihat penggunaan fungsi Perl dalam beberapa contoh dekat dengan apa yang saya cari tetapi tidak tahu di mana / bagaimana menggunakannya.
command-line
rename
mv
BradH
sumber
sumber
fba8255e8e9ce687522455f3e1561e53
adalah hash MD5 untukmynicepicture
, apakah itu berarti ekstensi harus dihapus sebelum hashing?md5sum <<<"file name"
yangfile name
file yang ada atau tidak, karena mempertimbangkan sebagai tali kecuali makan dengan nama file yang ada.Jawaban:
Anda tidak mengatakan shell mana yang ingin Anda gunakan, jadi saya hanya berasumsi Bash - jawabannya perlu penyesuaian untuk bekerja dengan shell lain.
Versi skrip:
for
Loop sederhana ini mengambil setiap file dalam direktori saat ini, menghitung jumlah md5 dari namanya dan menampilkannya. Gunakan ini untuk memeriksa fungsionalitas, jika Anda ingin mulai mengganti nama ganti yang keduaecho
denganmv
.Penjelasan
echo -n "$i" | md5sum
- menghitung jumlah md5 dari nama file lengkap termasuk ekstensi file ( Perpipaan ), untuk menghapus perubahan ekstensiecho -n "$i"
ke salah satu dari yang berikut:sum=$(…)
- jalankan…
dan simpan output dalam$sum
( Pergantian Perintah )${sum%% *}
- Keluarkan semuanya sampai spasi pertama ( Substitusi Parameter ), sama dengan salah satu dari yang berikut:${i##*.}
- Keluarkan semuanya setelah titik terakhir (Substitusi Parameter), sama seperti salah satu dari berikut ini:Jika Anda perlu mengganti nama file secara rekursif di folder yang berbeda, gunakan
find
dengan-exec
opsi.sumber
bash
Skrip ini menggunakanmd5sum
utilitas dari GNU coreutils untuk menghitung hash MD5 dari nama dasar (ekstensi sans) dari setiap nama path yang diberikan. Fungsi helpermd5name
melakukan perhitungan aktual dan akan menampilkan nama baru dengan jalur dan ekstensi lengkap.The
md5name
Fungsi menggunakanawk
untuk merakit nama baru dari bagian-bagian dari path yang diberikan dan hasil darimd5sum
.Contoh fungsi yang digunakan dengan sendirinya:
... di mana
c9e89fa443d16da4b96ea858881320c9
hash MD5 dari stringfile name here
.Hapus
echo
skrip dari atas untuk benar-benar mengganti nama file. Anda mungkin ingin menyimpan output dari skrip asli ke file (denganecho
di tempat) jika Anda pada suatu titik perlu mengembalikan nama file ke aslinya.Perhatikan bahwa menjalankan ini dua kali pada satu set file akan menghitung hash MD5 hash MD5, dan bahwa nama file asli kemudian menjadi tidak dapat dipulihkan kecuali Anda membuat catatan yang hati-hati tentang file apa yang disebut apa setelah setiap kali skrip dijalankan.
sumber
awk
porsinya bisa diganti denganwhile read sum dummy ; do printf "%s/%s.%s\n' $dir $sum $ext ; done ;
Kamu perludummy
menangkap '-'.awk
diri saya dan butuh beberapa saat untuk menggunakanbash
utilitas daripadasystem()
diawk
Dengan
perl
'srename
:(hapus
-n
saat senang).sumber
Untuk suatu
AWK
pendekatan:find
Perintah modern tidak memerlukan direktori untuk input.
diasumsikan, sehingga [Direktori] dapat dibiarkan kosong. The-type f
hanya menemukan file, yang berguna karenamd5sum
tidak menyukai direktori dan mengubah nama direktori saat menjalankan tidak akan menjadi ide yang baik. Gunakan-iname pattern
jika Anda hanya ingin menggunakan beberapa file, misalnya-iname \*.dat
, jika kasing penting, gunakan-name
sebagai ganti-iname
.The
match(...); sub(...)
potongan mengekstrak bagian dari nama file dan menggantikan mereka dalam string masukan. Catat itu"^"
dan"$"
[pra / ap] tertunda untuk mencegah penggantian string yang mungkin mengulang jalur / ekstensi.Ganti
print(com)
dengansystem(com)
untuk benar-benar melakukan penggantian nama.Jika Anda ingin menggunakan
md5sum
file aktual sebagai nama, Anda dapat menggunakan fakta yangmd5sum
menampilkan jumlah dan masukkan nama file untuk melakukan sesuatu seperti:The
while read sum file
akan mengambil 2 argumen, hasil darimd5sum
perintah, dan menetapkansum
danfile
variabel dengan mereka. Karenasum
seharusnya tidak memiliki ruang di dalamnya,read
seharusnya berfungsi dengan baik.Jelas itu
[echo]
harus dihapus ketika benar-benar berjalan, tetapi itu selalu ide yang baik ketika menguji perubahan skrip untuk menguji pencarian sebelum menjalankan.Ini semua menganggap Anda sedang berjalan
bash
. Juga, ini dapat diketik sebagai satu garis gondrong:sumber
Dalam pendekatan ini saya sering suka menggunakan.
Perintah "ls" menghasilkan aliran baris teks. Perintah "sed" mengubah setiap baris dengan aturan pencocokan pola. Perintah "sed" menampilkan perintah "mv" yang kemudian disalurkan melalui shell "sh" untuk dieksekusi. Parameter perintah "mv" seperti "mv oldfilename newfilename", yang mengubah nama file. Saya membangun nama file baru dengan perintah sed yang mengambil bagian sebelum titik terakhir, dan menggemakannya menjadi input dari perintah "md5sum", dan kemudian hanya mengambil hash dari output itu.
Berjalan melalui proses saya, daftar file pertama ('head -n 3' untuk hanya melihat 3 baris pertama):
Kemudian pikirkan tentang mentransformasikan dengan sed (belum memipakan perintah apa pun yang dihasilkan melalui shell)
Ada tiga pola kecocokan:
Saya ingin menggunakan sed untuk mengganti input nama file dengan "mv filename NEWfilename", tetapi karena saya mem-pipkan perintah melalui shell, saya dapat menghasilkan perintah yang mendapatkan md5sum, seperti ini
untuk mendapatkan hash
Dalam shell unix, kita dapat menggunakan operator backtick (`some_command`) untuk menjalankan sub-perintah, jadi misalnya
Kembali ke perintah mv, saya ingin sed untuk menghasilkan "mv di sini di sana" dengan "di sana" diganti dengan perintah backtick untuk mendapatkan md5sum. String di dalam sed-replace-string dimulai seperti ini
Tetapi jelas membuat hash yang sama untuk setiap nama file, karena perintah backticked dijalankan sebelum sed melihat string. Untuk menghentikan shell yang menjalankan perintah backtick sehingga sed akan menampilkan backtick, kita harus menambahkan dulu slash (juga ke karakter pipa), jadi sekali lagi:
Outputnya juga perlu nama file untuk dikutip dalam kasus spasi, jadi
Jadi mari kita coba yang ini, dengan menyalurkannya melalui shell:
Apa itu bekerja ? saya tebak:
Berikut ini adalah pendekatan untuk cross-check; gunakan opsi "ls" "-i" untuk menampilkan simpul-sistem file unix (yang tidak berubah dengan "mv"):
Atau, menggunakan perintah "tempel" (paket 'coreutils')
sumber
Saya suka jawaban satu baris, tetapi rusak karena mem-parsing nama file. Saya juga menabraknya sedikit dengan hash sha.
Saya pikir itu menarik file juga dan meletakkannya di dasar di mana perintah itu dimasukkan.
Terima kasih.
sumber