Solusi 1:
Salah satu caranya adalah dengan sed:
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
Ganti file
dengan nama file Anda, tentu saja. Ini akan mengganti apa pun yang bukan huruf, angka, titik, garis bawah, atau garis bawah dengan garis bawah. Anda dapat menambahkan atau menghapus karakter untuk mempertahankan sesuka Anda, dan/atau mengubah karakter pengganti menjadi yang lain, atau tidak sama sekali.
Solusi 2:
Saya berasumsi Anda menggunakan kotak Linux dan file dibuat di kotak Windows. Linux menggunakan UTF-8 sebagai pengkodean karakter untuk nama file, sedangkan Windows menggunakan yang lain. Saya pikir inilah penyebab masalahnya.
Saya akan menggunakan "convmv". Ini adalah alat yang dapat mengubah nama file dari satu pengkodean karakter ke yang lain. Untuk Eropa Barat, salah satu dari ini biasanya berfungsi:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
Jika Anda perlu menginstalnya di Linux berbasis Debian, Anda dapat melakukannya dengan menjalankan:
sudo apt-get install convmv
Ini bekerja untuk saya setiap saat dan memulihkan nama file asli.
Sumber:LeaseWebLabs
Solusi 3:
Saya memiliki beberapa file jepang dengan nama file rusak yang dipulihkan dari stik usb rusak dan solusi di atas tidak berhasil untuk saya.
Saya merekomendasikan paket detoksifikasi:
Utilitas detoks mengganti nama file agar lebih mudah digunakan. Ini menghilangkan spasi dan gangguan lainnya. Itu juga akan menerjemahkan atau membersihkan karakter Latin-1 (ISO 8859-1) yang disandikan dalam ASCII 8-bit, karakter Unicode yang disandikan dalam UTF-8, dan karakter lolos CGI.
Contoh penggunaan:
detox -r -v /path/to/your/files
-r Recurse into subdirectories -v Be verbose about which files are being renamed -n Can be used for a dry run (only show what would be changed)
Solusi 4:
Saya menganggap maksud Anda Anda ingin melintasi sistem file dan memperbaiki semua file tersebut?
Inilah cara saya melakukannya
find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
print("Renaming $_ to $new\n"); rename($_, $new);
}'
Itu akan menemukan semua file dengan karakter non-ascii dan mengganti karakter tersebut dengan garis bawah (_
). Berhati-hatilah, jika file dengan nama baru sudah ada, itu akan menimpanya. Skrip dapat dimodifikasi untuk memeriksa kasus seperti itu, tetapi saya tidak memasukkannya agar tetap sederhana.
Solusi 5:
Mengikuti jawaban di https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-characters, Anda dapat menggunakan:
rename 's/[^\x00-\x7F]//g' *
di mana *
cocok dengan file yang ingin Anda ganti namanya. Jika Anda ingin melakukannya di beberapa direktori, Anda dapat melakukan sesuatu seperti:
find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;
Anda dapat menggunakan argumen -n untuk rename
untuk melakukan uji coba, dan melihat apa yang akan diubah, tanpa mengubahnya.