Baru-baru ini saya menemukan file yang namanya dimulai dengan karakter '♫'. Saya ingin menyalin file ini, memasukkannya ke dalam ffmpeg
, dan merujuknya dengan berbagai cara lain di terminal. Saya biasanya secara otomatis melengkapi nama file yang aneh tetapi ini gagal karena saya bahkan tidak bisa mengetik huruf pertama.
Saya tidak ingin beralih ke mouse untuk melakukan manuver salin-tempel. Saya tidak ingin menghafal banyak kode untuk kemungkinan skenario. Solusi ad hoc saya adalah beralih ke vim
, rekatkan !ls
dan salin karakter yang dimaksud, lalu keluar dan rekatkan ke terminal. Ini berhasil tetapi cukup mengerikan.
Apakah ada cara yang lebih mudah untuk menangani skenario seperti itu?
CATATAN: Saya menggunakan kerang ikan jika itu mengubah keadaan.
sumber
*restoffile.avi
atau sesuatu seperti ini?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Jawaban:
Jika karakter pertama nama file dapat dicetak tetapi bukan alfanumerik atau spasi putih Anda dapat menggunakan
[[:punct:]]
operator glob:sumber
Yang paling sederhana yang terjadi pada saya adalah
ls [^a-zA-Z0-9]*
dan itu memang trik untuk saya, tetapi jawaban terdon lebih baik dalam membawa perhatian pada opsi shell extglob atau bahkan pendekatan shell-independent.sumber
ls [^[:alnum:]]*
melakukan hal yang sama. Tapi itu lebih baik menggunakan kelas karakter itu adalah , daripada kelas (es) itu tidak ; makals [[:punct:]]*
akan mencantumkan file ini.ls memiliki beberapa sakelar (seperti --quote-name, --escape, --literal) untuk berurusan dengan karakter yang tidak patut dicetak, tetapi dalam hal ini tampaknya karakter tersebut "dapat dicetak" tetapi tidak "dapat diketik" (setidaknya pada keyboard saya! ), jadi tak satu pun dari switch ini tampaknya membantu.
Oleh karena itu, sebagai pendekatan umum "brute force" untuk menyingkirkan file dengan karakter apa pun dalam namanya, Anda dapat melakukan ini:
Temukan baris yang berisi file yang menyinggung. Sangat mungkin itu akan menjadi baris ke-1, tetapi katakanlah itu adalah baris ke-5. Cetak baris 5 dan hex enkode:
Mengabaikan karakter 0a (baris baru), membuat string pelarian, dan menggunakan opsi -e dari gema untuk menerjemahkan escapes:
Sekarang Anda dapat menyalin / memindahkan / menghapusnya seperti ini:
Juga, jika Anda tidak dibatasi untuk menggunakan skrip shell, Anda bisa melakukannya dengan Python seperti ini:
Dengan menggunakan pendekatan ini, Anda dapat memproses banyak file, Anda hanya perlu menulis logika untuk memilih file yang benar, dan mengganti nama file tersebut tanpa mengganggu, dll:
sumber
Pendekatan serupa akan membuat daftar semua file yang tidak dimulai dengan karakter "normal". Di bash kamu bisa melakukan ini
Namun, itu sepertinya tidak tersedia untuk
fish
, jadi Anda bisa menggunakannyafind
sebagai gantinya:sumber
Ganti nama symlinks
Salah satu pendekatan untuk menangani nama file dengan karakter khusus - sebagai karakter pertama atau tempat lain dalam nama file adalah mengubah nama menjadi nama yang lebih sederhana .
Ini dapat digunakan bahkan jika Anda perlu menyimpan nama file asli : Ganti nama salinan nama file.
Itu bisa dilakukan dengan menyalin file, tetapi juga dengan membuat symlink atau hardlink ke file, dan mengganti nama ini.
cp
membuat symlink alih-alih salinan dengan opsi-s
(-l
untuk hardlink).Gunakan "detox" untuk membersihkan nama
Untuk mengganti nama untuk membersihkan nama file,
detox
dapat digunakan; Itu mengubah nama file untuk membersihkan nama file sesuai dengan berbagai aturan sebagaimana didefinisikan dalamdetoxrc
file. Secara default, karakter UTF8 baru saja dihapus; Dengan opsi-s utf_8-only
mereka digantikan oleh_
:"detoksifikasi" pada symlinks
Dikombinasikan dengan bekerja pada symlink seperti dijelaskan di atas:
sumber
Saya tidak menggunakan
fish
, tetapi dokumentasi mengatakan bahwa Anda dapat memasukkan karakter Unicode dengan awalan kode karakter hex dengan\u
(untuk karakter 16-bit) atau\U
(untuk karakter 32-bit). Saya pikir kodenya♫
adalah491eb
, jadi Anda bisa melakukannya:untuk mengganti nama
♫abc.mp3
.Perhatikan bahwa Anda memerlukan nol di depan, jika tidak,
abc
pada akhirnya akan diperlakukan sebagai digit hex, dan bagian dari kode karakter; untuk karakter 32-bit Anda harus memasukkan 8 digit.sumber
Saya tidak tahu apakah itu sudah terjadi pada tahun 2014 ketika Anda mengajukan pertanyaan, tetapi dalam versi saat ini
fish
(pada 2019), Anda dapat menekan Tabdua kali, untuk mendapatkan pilihan gaya zsh di mana Anda dapat menggunakan tombol panah untuk pilih secara visual file yang Anda inginkan tanpa harus mengetikkan bagian mana pun dari nama file.sumber
Ikan tidak mendukung wildcard braket ¹ sesuai desain.
Perintah tidak mencari di direktori dan menampilkan disembunyikan nama file yang tidak dimulai dengan karakter
letters
,digits
,.
_
-
(cf dokumentasifind
).Catatan:
$argv
adalah variabel array khusus (shell Ikan) yang berisi argumen fungsi karena itu perintah yang mendasari dapat menerima ekspresi apa pun (misalnya alias ).¹ Faktanya, Fish mendukung ekspansi braket (ekspansi variabel array) tetapi Bash menggunakan terminologi lain (ekspansi parameter dan nama file).
sumber
Gunakan
zsh
dan ketik apa yang terjadi selanjutnya. ZSH mendukung fuzzy auto complete dan dapat menanganinya. (Sangat bagus dengan plugin OH-MY-ZSH .)sumber
Anda tidak mengatakan apakah Anda ingin menyimpan nama file yang bermasalah ini. Salah satu solusinya mungkin dengan "memperbaiki" masalah sekali dan untuk semua dengan mengubah nama (beberapa atau semua) file Anda menjadi nama yang dapat Anda ketik dengan menjalankan skrip ini:
Ini akan mencantumkan nama file Anda yang ada, masing-masing diikuti oleh
...?
. Ketik sajaEnter untuk meninggalkan file apa adanya; atau ketik nama baru untuk mengganti nama itu. The-i
pilihan akan menyebabkan itu untuk meminta Anda untuk mengkonfirmasi Timpa jika Anda menentukan nama file lain yang ada.Script ini dapat dimodifikasi dengan beberapa cara:
*
) menjadi sesuatu yang lebih ketat, misalnya,*.avi *.mov
, jadi Anda tidak perlu melihat setiap file.mv
kecp
, jadi Anda menyimpan salinan file dengan nama saat ini dan membuat salinan (sementara?) Dengan nama yang dapat diketik.Anda bisa membuat nama file baru yang didasarkan pada nama file yang ada. Sebagai contoh,
yang memungkinkan Anda menampar awalan di depan nama lama. Jika Anda memilih awalan unik, ini akan memungkinkan Anda menggunakan pelengkapan otomatis.
sumber