Saya entah bagaimana berhasil membuat file yang sepertinya tidak memiliki nama file. Saya menemukan beberapa informasi tentang cara mendapatkan rincian lebih lanjut dari file di utas berikut .
Namun, saya mencoba beberapa saran yang tercantum dan sepertinya tidak dapat menghapus file. Saya tidak yakin apa yang saya lakukan untuk membuatnya, tetapi itu terjadi ketika mencoba menyalin file xml.
Beberapa info pada file tersebut adalah sebagai berikut;
> ls -lb
total 296
-rw-r--r-- 1 voyager endeavor 137627 Jan 12 12:49 \177
> file *
: XML document
> ls -i
417777
Saya mencoba untuk menemukan menggunakan saklar inum dan kemudian pipa itu ke rm karena itu sepertinya cara paling mudah untuk menghilangkannya. Namun, contoh yang diberikan di bagian bawah utas yang ditautkan di bawah gagal untuk saya. Contohnya adalah:
> find -inum 41777 -exec ls -al {} \;
find: illegal option -- i
find: [-H | -L] path-list predicate-list
jadi saya mencoba menggunakan daftar path terlebih dahulu seperti berikut, tetapi itu tidak berhasil:
> find . -inum 41777 -exec ls -al {} \;
Saya tidak yakin apa karakter yang tidak dapat dicetak \ 177 atau bagaimana saya bisa meneruskannya ke rm
perintah, tapi saya benar-benar ingin memastikan saya tidak mengacaukan file / direktori lain dalam upaya saya menghapus file ini.
sumber
\177
adalahDEL
karakter ASCII .0
?Jawaban:
File memiliki nama, tetapi terbuat dari karakter yang tidak dapat dicetak. Jika Anda menggunakan ksh93, bash, zsh, mksh atau FreeBSD sh, Anda dapat mencoba menghapusnya dengan menentukan nama yang tidak dapat dicetak. Pertama pastikan bahwa nama itu benar:
ls -ld $'\177'
Jika itu menunjukkan file yang tepat, maka gunakan rm:rm $'\177'
Pendekatan lain (sedikit lebih berisiko) adalah menggunakan
rm -i -- *
. Dengan opsi -i rm memerlukan konfirmasi sebelum menghapus file, sehingga Anda dapat melewati semua file yang ingin Anda simpan kecuali yang satu.Semoga berhasil!
sumber
rm -i *
tidak akan berhasil dalam kasus ini; karena baris baru, shell akan meluas*
ke sesuatu yangrm
tidak akan dikenali sebagai nama file.bash
dan GNUrm
. Pada sistem saya,rm *
,rm -i *
, danrm Ctrl-V DEL TAB ENTER
semua pekerjaan dengan benar, bahkan jika nama file berisi karakter baris baru (saya menggunakan"\177foo\nbar\n"
). Beberapa perintah tidak menangani nama file seperti itu dengan baik, tetapi alat GNU tampak kuat; versi non-GNU dari alat yang sama mungkin tidak berlaku juga. Bagaimanapun, berbagai trik dalam jawaban ini berguna untuk diketahui.rm
tidak pernah melakukan segala bentuk pemisahan kata apakah itu GNUrm
atau bukan. Shell memperluas gumpalan dan, ketika mengeksekusi perintah yang dipanggil, ia meneruskan nama file yang dihasilkan sebagai argumen dipisahkan nol (dalam kode C). Yang berbahaya adalah menyalurkan daftar file ke sesuatu yang menggunakan baris baru sebagai pembatas; lihat Mengapa mengulangi hasil praktik buruk?Bagi yang menggunakan
vim
jalankan di direktori kerja saat ini:dan arahkan ke file dengan tombol panah atau
j/k
. Lalu tekanShift+D
dan konfirmasi penghapusan dengany
.sumber
Mungkin ada cara untuk meneruskan nama file
rm
, tetapi jika Anda khawatir akan mengacaukan apa pun, Anda dapat menggunakan manajer file GUI. Emacs hadir dengan mode pengeditan direktori yang dapat Anda gunakan jika sudah diinstal:Buka folder
emacs
. Anda dapat menjalankanemacs /path/to/folder
, atau membuka emacs, tekan Esc+ x, dan jalankandired
, yang akan meminta pathhttp://so.mrozekma.com/unix-dired-delete1.png
Pindah ke baris dengan file yang ingin Anda hapus dan tekan d. Anda akan melihat
D
di margin kiri di sebelah file:http://so.mrozekma.com/unix-dired-delete2.png
Tekan xuntuk menyimpan perubahan Anda. Ini akan meminta untuk memastikan Anda ingin menghapus file; tekan y:
http://so.mrozekma.com/unix-dired-delete3.png
sumber
vim
jalankan di direktori kerja saat ini:vim ./
dan navigasikan ke file dengan tombol panah. Lalu tekanShift+D
dan konfirmasi penghapusan dengany
.vim
untuk mendukungAnda telah menunjukkan dengan
file *
bahwa shell glob (*
) dapat mengambil file ini, jadi sekarang lakukan sajarm
pada glob tersebut.rm -i *
n
semua file kecuali file dengan nama file yang tampaknya tidak terlihatsumber
File sebenarnya memiliki nama, tetapi terbuat dari karakter yang tidak dapat dicetak.
Metode yang mudah adalah dengan mengandalkan penyelesaian shell: tekan Tabberulang kali hingga nama file "aneh" dimasukkan. Anda harus sudah mengonfigurasi shell Anda untuk siklus di antara kemungkinan penyelesaian:
menu-complete
, yang tidak terikat secara default, bukancomplete
, yang terikat Tabsecara default. Atau, gunakan Esc *untuk memasukkan penyelesaian untuk semua file, dan hapus yang Anda tidak ingin hapus dari baris perintah.setopt auto_menu
atausetopt menu_complete
mengatur.Jika penyelesaian tidak membantu dalam shell Anda, Anda dapat memanggil
rm -i -- *
dan menjawab "tidak" kecuali untuk file khusus ini. Jika nama file tidak dimulai dengan karakter yang dapat dicetak, Anda dapat membatasi kecocokan untuk file yang karakter pertamanya tidak berada dalam serangkaian karakter yang dapat dicetak:(Hati-hati jika pola Anda mungkin cocok dengan file yang dipanggil
-f
, yangrm
akan diperlakukan sebagai opsi.)Metode lain adalah menelepon
ls -i
untuk menemukan inode file (sebuah inode secara unik mengidentifikasi file pada sistem file yang diberikan), kemudianfind -inum
untuk beroperasi pada file tertentu. Metode ini sebagian besar berguna ketika direktori berisi banyak file.Jika Anda
find
tidak memiliki-delete
opsi, hubungirm
:(Ya, saya tahu bahwa sebagian besar sudah diposting. Tetapi jawaban dengan informasi yang relevan membuat ini lebih rumit dari yang seharusnya.)
sumber
Coba gunakan
echo -e
untuk mendapatkan karakter\177
, laluxargs
meneruskannyarm
.Ternyataecho
tidak mengambil jalan keluar desimal, jadi konversikan ke hex:177
is oktal;echo
membutuhkan\0
(literal, bukan byte nol) sebelum:sumber
\xb1
adalah desimal177
,\0
null-mengakhiri itu, dan-0
memberitahuxargs
untuk mengambil nama yang diakhiri null alih-alih yang diakhiri baris baru.echo
, apa adanya, mengirim 2 nama file ke xargs, dan kemudian kerm
... nama file kedua adalah\n
.. Ini menghasilkan kesalahan, atau menghapus file dari nama itu ('\ n')-n
untuk menyingkirkan baris baru.Saya hanya bisa menjamin Anda bahwa file tersebut memang memiliki nama. Itu hanya nama yang mengandung karakter yang tidak dapat dicetak.
Jika
rm
tidak berhasil, maka gunakan outputfind
dengan-inum
opsi sebagai argumenrm
tidak mungkin membantu; itu hanya akan memberikan argumen yang samarm
, dengan masalah yang sama.File adalah satu-satunya di direktori itu, kan?
Hal pertama yang saya coba adalah
cd
masuk ke direktori, lalu ketikrm ./
, lalu tekan tombol Tab. Ini harus memperluas argumen ke nama sebenarnya file, dan sebelumnya./
harus mencegahrm
dari menafsirkan argumen sebagai sesuatu selain nama file.Solusi lain adalah dengan
cd
ke direktori induk, kemudian gunakanrm -r
(atau, jika perlu,rm -rf
) pada direktori. Itu harus menghapus direktori dan semua isinya, terlepas dari nama. Anda kemudian dapat menggunakanmkdir
untuk membuat ulang direktori (dan mungkinchmod
untuk mengembalikan izinnya).SUNTING :
Melihat
ls -lb
output Anda lagi, saya pikir nama file dimulai denganDEL
karakter ASCII (yang buruk tidak fatal) dan berisi satu atau lebih karakter baris baru (yang benar-benar buruk). Sejauh yang saya tahu,rm
perintah tidak dapat menafsirkan baris baru sebagai bagian dari nama file.Tetapi
unlink()
panggilan sistem bisa. Berikut adalah skrip Perl yang saya buat bersama yang akan diulang melalui file di direktori saat ini, dan meminta Anda untuk masing-masing apakah Anda ingin menghapusnya. Itu tidak menggunakan perintah eksternal sukarm
menghapus file, sehingga harus dapat menangani karakter lucu yang didukung sistem file (apa pun selain ASCIINUL
dan/
).Melakukan
rm -r
ataurm -rf
pada direktori yang berisi harus tetap berfungsi, tetapi jika Anda hanya ingin menghapus satu file, Anda dapat mencoba ini.(Solusi lain, jika ada file lain di direktori yang ingin Anda simpan, adalah memindahkan semua file lain ke direktori sementara, lalu nuke dan buat kembali direktori dan pindahkan file lainnya kembali.)
(Oh, dan apa pun yang Anda lakukan untuk membuat file itu, cobalah untuk tidak melakukannya lagi!)
sumber
Jika Anda dapat menemukan persis file yang menggunakan
find
perintah, maka Anda dapat menggunakan-delete
predikat. Berhati-hatilah, dan buat-delete
parameter terakhir dari perintah find atau akan sangat menyakitkan ...sumber
Anda dekat. Langkah demi langkah, inilah cara menghapus file dengan nomor inode.
Pertama, temukan nomor inode dari file yang Anda inginkan, gunakan
ls -li
. Nomor inode akan berada di kolom pertama output.Sebagai contoh:
Dalam hal ini, nomor inode adalah 311010
Gunakan
find
untuk mencari file dengan nomor inode.Pastikan
find
hanya mengembalikan nama file yang ingin Anda hapus. Sebagai contoh:Setelah Anda yakin
find
menemukan file yang tepat, maka berikan-delete
parameter kefind
. Ini akan menghapus file untuk Anda.sumber
Jawaban lainnya bagus dan akan bekerja di hampir semua lingkungan.
Tetapi, jika Anda memiliki gui yang berjalan, cukup buka direktori di nautilus, dolphin, konqueror, atau pengelola file favorit Anda dan Anda seharusnya dapat dengan mudah melihat dan menghapus file apa pun yang memiliki nama tidak kooperatif dengan beberapa klik mouse. .
Jika Anda bukan pengguna emacs atau vim biasa (seperti yang ditampilkan dalam beberapa jawaban lain), ini mungkin cara termudah untuk melakukannya.
sumber
Punya masalah serupa dengan file bernama "\ 033" (karakter "Escape" yang sebenarnya).
Di atas akan meminta Anda untuk menghapus file di direktori saat ini yang tidak dimulai dengan huruf atau angka.
sumber
Sebagai gantinya, Anda dapat mengganti nama direktori saat ini menjadi
DirX_OLD
, membuat direktori baru dengan namaDirX
dan memindahkan semua file yang diperlukan dariDirX_OLD
keDirX
. Setelah menyalin file, Anda dapat menghapusDirX_OLD
sumber
Kalau-kalau itu membantu siapa pun saya akan menambahkan dua sen saya senilai. Saya bisa mendapatkan nama file menggunakan
stat
wildcard seperti ini:Keluaran:
Kemudian saya bisa menggunakan string ANSI C-dikutip (seperti yang digunakan dalam jawaban yang diterima) untuk mengakses file:
sumber
Setiap file memiliki nama, Anda hanya perlu menemukan yang mana.
Saya akan menggunakan file ini sebagai contoh:
File-file itu akan ditampilkan seperti
?
biasals
:Tetapi jika Anda
ls
mengizinkan-Q
opsi itu harus jelas apa nama file aslinya:itu adalah nomor inode dan nama "Dikutip" di
1
kolom file dalam pwd.Itu menggunakan hability dari shell (POSIX) untuk menggunakan ekspansi (globbing):
Untuk memiliki nama dengan karakter non-cetak:
Dan untuk membuat daftar file yang mungkin hanya memiliki karakter non-cetak:
Kemudian, untuk secara selektif (opsi
-i
(interaktif)) menghapusnya gunakan:Anda hanya perlu memilih mana yang akan dihapus dengan menjawab
y
pertanyaan di atas.sumber
Jika Anda memiliki bash dengan pelengkapan otomatis, ini mungkin cocok untuk Anda. Saya mengetik karakter yang ditampilkan dalam daftar direktori. Kemudian saya memicu pelengkapan otomatis dan menamai ulang hal itu menjadi sesuatu yang dapat dicetak.
Inilah yang bekerja untuk saya:
sumber
bekerja untukku.
sumber