Dengan asumsi bahwa "asing" berarti "bukan karakter ASCII", maka Anda dapat menggunakan find
dengan pola untuk menemukan semua file yang tidak memiliki karakter ASCII yang dapat dicetak atas namanya:
LC_ALL=C find . -name '*[! -~]*'
(Spasi adalah karakter yang dapat dicetak pertama yang tercantum di http://www.asciitable.com/ , ~
adalah yang terakhir.)
Petunjuk untuk LC_ALL=C
diperlukan (sebenarnya, LC_CTYPE=C
dan LC_COLLATE=C
), jika rentang karakter ditafsirkan salah. Lihat juga halaman manual glob(7)
. Karena LC_ALL=C
sebab find
untuk menafsirkan string sebagai ASCII, itu akan mencetak karakter multi-byte (seperti π
) sebagai tanda tanya. Untuk memperbaiki ini, pipa ke beberapa program (misalnya cat
) atau redirect ke file.
Alih-alih menentukan rentang karakter, [:print:]
juga dapat digunakan untuk memilih "karakter yang dapat dicetak". Pastikan untuk mengatur lokal C atau Anda mendapatkan perilaku yang cukup (tampaknya) sewenang-wenang.
Contoh:
$ touch $(printf '\u03c0') "$(printf 'x\ty')"
$ ls -F
dir/ foo foo.c xrestop-0.4/ xrestop-0.4.tar.gz π
$ find -name '*[! -~]*' # this is broken (LC_COLLATE=en_US.UTF-8)
./x?y
./dir
./π
... (a lot more)
./foo.c
$ LC_ALL=C find . -name '*[! -~]*'
./x?y
./??
$ LC_ALL=C find . -name '*[! -~]*' | cat
./x y
./π
$ LC_ALL=C find . -name '*[![:print:]]*' | cat
./x y
./π
LC_ALL=C
sebagai gantiLC_COLLATE=C
karena tidak masuk akal untuk mengatur LC_COLLATE ke C tanpa pengaturanLC_CTYPE
dan untuk memastikan itu masih berfungsi bahkan ketika variabel LC_ALL berada di lingkungan.SPC
dapat dicetak , lalu bagaimanaTAB
danLF
yang juga biasanya ditemukan dalam file teks?LC_COLLATE
danLC_CTYPE
, lihat juga halamanfind(1)
manual.Jika Anda menerjemahkan setiap nama file menggunakan
tr -d '[\200-\377]'
dan membandingkannya dengan nama asli, maka setiap nama file yang memiliki karakter khusus tidak akan sama.(Di atas dengan asumsi bahwa yang Anda maksud non-ASCII dengan asing)
sumber
[
dan]
di sebagian besartr
implementasi.[
dan]
di sistem saya.[
dan]
s). Terima kasih.Anda dapat menggunakan
tr
untuk menghapus karakter asing apa pun dari nama file dan membandingkan hasilnya dengan nama file asli untuk melihat apakah itu berisi karakter asing.sumber
find
keluaran proses , gunakan keluaran / input yang diakhiri NUL seperti yang ditunjukkan dalam jawaban ini .Jawaban yang diterima sangat membantu, tetapi jika nama file Anda sudah ada dalam pengkodean yang ditentukan di
LANG
/LC_CTYPE
, lebih baik lakukan saja:Kelas karakter dipengaruhi oleh
LC_CTYPE
, tetapi perintah di atas tidak menggunakan kelas karakter, hanya rentang, jadiLC_CTYPE
hanya mencegah karakter yang tidak biasa digantikan oleh tanda tanya.sumber