Pergi ke direktori dengan nama yang tidak dikenal

8

Saat membongkar tarball, saya menemukan direktori yang lsmelaporkan 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?

jackd243
sumber
Apakah mungkin secara leksikal pertama dalam daftar direktori? Maka cd */mungkin bekerja. *harus memperluas deskripsi shell dari direktori, dan cdmengabaikan 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 -execberalih ke find, not with cd` secara langsung (yang merupakan built-in shell) tetapi dengan lsalat eg dan lainnya.
Daniel Andersson
@Aniel: Dalam beberapa shell, cddengan beberapa argumen gagal.
Scott
@Scott: Benar. POSIX tidak menentukan perilaku beberapa argumen. Bash dan Dash mengabaikan argumen tambahan, csh keluar dengan " too many arguments".
Daniel Andersson

Jawaban:

3

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:

ls -lia
  • -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:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

Sekarang Anda dapat mengubah ke direktori itu menggunakan:

cd "$(find -inum ######)"

... tetapi gantikan ###### dengan angka panjang yang Anda dapatkan di daftar direktori.

Tentu saja perintahnya tidak harus cd. Bisa jadi rm, cp, mv, dll ...

Tyilo
sumber
2

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:

alias ls='ls -q'

Anda dapat melihat apakah distribusi Anda telah melakukannya dengan mengetikkan ke shell Anda:

alias ls

Yang akan mencetak sesuatu seperti berikut:

$ alias ls
alias ls='ls --color=auto'

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)

$ ls | od -b

Akan menunjukkan kepada Anda bentuk oktal dari kode kontrol.

$ ls | od -c

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. :-)

Speeddymon
sumber
0

"?" 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.

Valrian
sumber
1
Tapi ingat bahwa lssuka menampilkan karakter non-ASCII (≥0x7F) sebagai ?–– jadi nama direktori mungkin bukan hanya serangkaian tanda tanya.
Scott
0

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 ketik

cd ????????????????????*

Wildcard 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

mv ????????????????????* nama baru

Scott
sumber
3
Mungkin bermanfaat untuk dijalankan lsdengan salah satu --quoting-style=shellatau --quoting-style=escapeopsi untuk memaksanya menghasilkan versi nama file yang lolos dengan benar.
Dan D.
1
@DanD. +1 untuk opsi keren yang tidak saya ketahui. Saya biasanya hanya menggunakan file manager gui ketika sesuatu seperti ini harus ditangani, tetapi mungkin berguna jika saya harus bekerja dari konsol atau dalam skrip.
Joe
0

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.

kmort
sumber
0

Gunakan browser file seperti Midnight Commander (teks), Nautilus (GNOME) atau Dolphin (KDE) untuk bekerja dengan direktori.

Michael Hampton
sumber
0

untuk bekerja dengan direktori (atau file) yang memiliki nama aneh / sulit diketik:

1) Jalankan ls -iuntuk menemukan inode file.

lsOpsi 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

 find * -prune -inum 9961926 -exec rm -i {} \;

untuk menghapus file

atau

 find * -prune -inum 9961926 -exec mv {} other-name \;

untuk memindahkannya ke nama yang lebih baik

atau bahkan

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

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)

josinalvo
sumber