Saat membongkar tarball, saya menemukan direktori yang ls
melaporkan sebagai "???????????????????". Agaknya, namanya tidak di unicode? Lagi pula, saya tidak dapat menemukan cara untuk mengakses folder. Saya sudah mencoba cd $(find -inum inode_number)
, tetapi itu memberi saya
"bash: cd: ./??????????: No such file or directory".
Apakah ada cara lain untuk mengakses folder secara langsung dengan nomor inode-nya?
filenames
inode
directory-listing
jackd243
sumber
sumber
cd */
mungkin bekerja.*
harus memperluas deskripsi shell dari direktori, dancd
mengabaikan argumen tambahan. Cara lain mungkin dengan menggunakan manajer file grafis (termasuk MC berbasis terminal) atau navigator pohon file bawaan di misalnya Vim. Anda juga dapat bereksperimen dengan-exec
beralih kefind, not with
cd` secara langsung (yang merupakan built-in shell) tetapi denganls
alat eg dan lainnya.cd
dengan beberapa argumen gagal.too many arguments
".Jawaban:
Pendekatan umum untuk dapat beroperasi pada direktori (atau file) apa pun adalah dengan menggunakan nomor inode-nya.
Pertama, gunakan ls untuk mendapatkan inode folder yang dimaksud:
-l
untuk daftar panjang (opsional)-i
untuk mendapatkan nilai inode-a
untuk melihat semua file, bahkan file tersembunyi (opsional)Dalam cantuman Anda akan melihat nomor panjang di kolom pertama, kira-kira seperti ini:
Sekarang Anda dapat mengubah ke direktori itu menggunakan:
... tetapi gantikan ###### dengan angka panjang yang Anda dapatkan di daftar direktori.
Tentu saja perintahnya tidak harus
cd
. Bisa jadirm
,cp
,mv
, dll ...sumber
Karena karakter tersebut kemungkinan adalah karakter internasional, mereka kemungkinan muncul sebagai kode kontrol dalam rangkaian karakter en_US Anda, itulah sebabnya ls menunjukkannya sebagai tanda tanya.
Ini mungkin karena pilihan distribusi Anda untuk alias secara default di profil global. Sebagai contoh:
Anda dapat melihat apakah distribusi Anda telah melakukannya dengan mengetikkan ke shell Anda:
Yang akan mencetak sesuatu seperti berikut:
Halaman yang tertaut di bawah ini menunjukkan bahwa jika Anda melakukan "ls -b", Anda akan melihat kode kontrol oktal sehingga Anda tahu setidaknya karakter apa yang digunakan.
http://www.arsc.edu/arsc/support/howtos/nonprintingchars/
Dengan asumsi itu tidak berhasil, Anda memiliki pilihan lain yang juga disebutkan lebih dekat ke bawah:
Alat yang saya tidak sadari sampai sekarang bernama OctalDump (di Debian - / usr / bin / od)
Akan menunjukkan kepada Anda bentuk oktal dari kode kontrol.
Akan menampilkan karakter termasuk ruang kosong tambahan tersembunyi yang mungkin ada di akhir (perhatikan spasi tambahan di akhir dalam contohnya)
Setelah Anda tahu karakter kontrol apa yang sedang dimainkan dan apakah ada spasi kosong tambahan, Anda mungkin dapat menemukan cara untuk melakukan cd ke direktori dengan keluar dari karakter kontrol. Jika gagal, Anda memiliki beberapa opsi untuk mengganti nama direktori.
Halaman di atas juga, dengan mudah, memiliki metode cepat dan kotor untuk menghapus karakter kontrol melalui perintah mv, yang saya pikir akan berhasil, selama Anda DO melarikan diri dari ruang, tetapi DONT lolos dari tanda tanya (sehingga membuat mereka karakter tunggal wildcard), dan selama tidak ada lagi yang ada di direktori di mana direktori jahat ini berada. Alasan untuk persyaratan eksplisit ini adalah karena Anda hanya menggunakan karakter wildcard dan satu ruang, dan karenanya Anda tidak ingin wildcard secara tidak sengaja cocok dengan file atau direktori lain.
Jika metode di atas tidak berhasil, Anda hampir pasti dapat menggunakan metode temukan yang disebutkan oleh respons lain, dengan cara yang berbeda. Daripada mencoba untuk cd ke direktori menggunakan nomor inode, yang adalah apa yang Anda katakan telah Anda coba, Anda dapat mengganti nama menggunakan nomor inode. Pastikan untuk menyalin seluruh rangkaian 3 baris untuk satu perintah dari halaman di atas (ganti bagian "nama yang diinginkan" dengan nama sebenarnya yang ingin Anda ganti namanya).
Setelah direktori diganti nama, maka Anda harus dapat mengaksesnya. Saya hanya bisa berharap bahwa itu juga tidak berisi file dengan kode kontrol dalam nama, atau Anda harus membilas dan mengulangi untuk setiap file (dan / atau subdirektori) di direktori yang baru saja Anda ganti namanya, pada titik mana untuk loop akan mungkin lebih bijak untuk hanya memberi nama setiap file sebagai angka, dengan menambahkan dari 1. :-)
sumber
"?" memiliki makna khusus di shell, itu berarti "karakter apa pun, termasuk tidak ada". Jadi jika file Anda benar-benar bernama "???????????????????" Anda mungkin harus melarikan diri dari "?" (dan spasi juga) sehingga Anda dapat mencoba sesuatu seperti cd \? \? \? \? \? \? \ \? \? \? \? (jika Anda belum mencoba)
Itu dengan asumsi seseorang sengaja memberi file itu nama yang rumit, bukan yang rusak / rusak / encoding ilegal.
sumber
ls
suka menampilkan karakter non-ASCII (≥0x7F) sebagai?
–– jadi nama direktori mungkin bukan hanya serangkaian tanda tanya.Lakukan
ls
. Apakah ada sesuatu dalam direktori (file atau subdirektori) dengan nama yang lebih panjang dari subdirektori misteri Anda (yaitu 21, jika “???????????????????????????” adalah tepat)? Kemudian ganti nama mereka menjadi nama yang lebih pendek atau pindahkan ke direktori lain. Kemudian ketikWildcard ini (20 tanda tanya diikuti oleh tanda bintang) harus cocok dengan nama apa pun yang panjangnya 20 karakter atau lebih –– dan instruksi pertama yang saya berikan harus memastikan bahwa subdirektori misteri Anda adalah satu-satunya hal yang cocok dengan pola itu. Tetapi mungkin lebih bermanfaat untuk dilakukan
sumber
ls
dengan salah satu--quoting-style=shell
atau--quoting-style=escape
opsi untuk memaksanya menghasilkan versi nama file yang lolos dengan benar.Salah satu cara mudah untuk melihat apa yang ada di sana adalah FTP ke mesin dengan FileZilla. Kemudian Anda dapat menggunakan FileZilla untuk mengganti nama direktori.
sumber
Gunakan browser file seperti Midnight Commander (teks), Nautilus (GNOME) atau Dolphin (KDE) untuk bekerja dengan direktori.
sumber
untuk bekerja dengan direktori (atau file) yang memiliki nama aneh / sulit diketik:
1) Jalankan
ls -i
untuk menemukan inode file.ls
Opsi ini akan memberi Anda setiap nama file, dan pengidentifikasi untuk file ini pada sistem file (inode)2) Gunakan find untuk menjalankan perintah pada file
mengatakan inode adalah 9961926
kamu bisa lari
untuk menghapus file
atau
untuk memindahkannya ke nama yang lebih baik
atau bahkan
untuk memberikan nama baru sambil mempertahankan nama lama
(agaknya, Anda bisa menjalankan perintah lain juga. Sayangnya saya tidak bisa menggunakan baris ini untuk menjalankan a
cd
)sumber