Saya salah ketik:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
Sekarang saya punya file yang disebut ^ C (ctrl + C) !! Ketika saya menggunakan ls
saya hanya melihat tanda tanya (mungkin karena lokal?)
% ls -al
total 60
drwxr-xr-x 2 root wheel 512 Jan 21 09:35 ? <- this one
drwxr-xr-x 5 admin wheel 512 Jan 21 16:24 .
drwxr-xr-x 3 root wheel 512 Jan 20 14:29 ..
-rw-r--r-- 1 admin nobody 1114 Jan 20 19:10 .cshrc
-rw------- 1 admin wheel 6002 Jan 21 15:27 .history
-rw-r--r-- 1 admin nobody 182 Jan 20 14:29 .login
-rw-r--r-- 1 admin nobody 91 Jan 20 14:29 .login_conf
-rw------- 1 admin nobody 301 Jan 20 14:29 .mail_aliases
-rw-r--r-- 1 admin nobody 271 Jan 20 19:04 .mailrc
-rw-r--r-- 1 admin nobody 726 Jan 20 19:05 .profile
-rw------- 1 admin nobody 212 Jan 20 14:29 .rhosts
-rw-r--r-- 1 admin nobody 911 Jan 20 19:06 .shrc
drwx------ 2 admin nobody 512 Jan 20 15:05 .ssh
drwxr-xr-x 2 admin wheel 512 Jan 20 19:08 bin
dan
% ls -i
3611537 ? 3611534 bin
Saya ingin menghapus file ini. Saya mencoba mv
dan ketika menggunakan penyelesaian tab itu menunjukkan kepada saya:
% mv
^C/ bin/
Jelas saya tidak bisa mengetikkan ^ C: - / Bagaimana cara menghapus file ini?
filesystems
freebsd
Mausy5043
sumber
sumber
dsw
tidak membuatnya menjadi POSIX.emacs -nw -f dired
memberikan navigator direktori. <kbd> D </kbd> menghapus file di bawah kursor setelah konfirmasi.Jawaban:
^V
( ctrl+ v) berfungsi sebagai semacam urutan pelepasan untuk penekanan tombol berikutnya, memasukkan nilai yang terkait alih-alih mengambil tindakan apa pun yang biasanya dikaitkan.Memanfaatkan ini,
^V^C
( ctrl+ v, ctrl+ c) harus bekerja untuk memasukkan nama file Anda yang sulit di terminal.sumber
^V^C
tidak tidak bekerja dalam editor garis Zsh; yang dikutip-insert widget (mencari halaman untuk^V
) secara eksplisit tidak memasukkan karakter interupsi. Jawaban Jakob (menggunakan printf) mungkin cara yang lebih portabel untuk memasok karakter kontrol dalam argumen shell.Anda juga dapat menghapus file dengan inode:
Apa pun yang Anda lakukan, demi Tuhan, jangan menempatkan
-delete
sebelumnya-inum
:Selamat, Anda baru saja menghapus semua file Anda. Dengan
find
, urutan argumen penting !sumber
-delete
sebelumnya-inum
? Apakah ini hanya tindakan pencegahan jika Anda menekan enter sebelum waktunya atau apakah urutan argumen benar-benar mempengaruhi hasilnya?-delete
perintah, titik, sampai Anda menjalankan perintah tanpa-delete
memeriksa apakah itu menemukan apa yang Anda inginkan.-print
bukan-delete
membuat tes yang sangat bagus.Pilihan lain adalah menggunakan
rm -ri ./*
;rm
akan bertanya kepada Anda sebelum menghapus file dan direktori apa pun, jadi Anda hanya perlu membalasy
file "buruk", dann
semua yang lain.Sebenarnya, dalam kasus Anda, Anda bahkan dapat mengurangi jumlah balasan yang diperlukan dengan melakukan
rm -ri ./?
, karena file "buruk" Anda hanya satu karakter.sumber
select f in ?; do rm -i "$f"; break; done
memiliki semua manfaat-i
, tanpa kesulitan harus menjawabno
untuk memimpin yang tidak diinginkan atau salah menjawab ya untuk orang yang ingin Anda pertahankan.rmdir ?/
akan menghapus semua direktori karakter tunggal yang kosong, dan mengeluh tentang yang lain tidak kosong.select
ada, cukup rapi!-r
(dan./
- selalu mudah untuk melupakan) ke contoh saya, karena sayangnyarmdir
tidak mendukung-i
bendera. Tetap saja, saya kira dalam hal ini cara terbaik untuk pergi adalah kombinasi dari uskup dan komentar Anda.select
hanya ada di beberapa shell, yang mungkin mengapa Anda belum menemukan itu - skrip dan solusi yang dimaksudkan untuk portabel menghindarinya, jadi kami cenderung melihatnya "di alam liar".Salah satu opsi adalah mencari nama file dengan sesuatu selain
ls
. Jika Anda tahu itu diproduksi oleh Ctrl+ kata demi kata C, Anda dapat menemukan karakter ASCII yang diproduksi menggunakan tabel karakter kontrol , atau dengan antarmuka yang lebih ramah seperti yang disediakan oleh Python:Pilihan lain adalah melihat dump hex output
ls
, menggunakan mishexdump
.Kemudian Anda dapat menghapus file dengan (misalnya) perintah bash ini:
(Kutipan ganda hanya diperlukan jika karakter yang Anda coba cetak ada dalam
IFS
variabel Anda , seperti\x20
atau\x0A
, tapi itu kebiasaan yang baik untuk mengutip pergantian perintah kecuali Anda tahu Anda ingin shell untuk melakukan pemisahan bidang, dll.)sumber
cat -v
(plusman ascii
) dapat membantu untuk bagian pertama.os.rmdir('\x03')
langsung dari shell Python.Seringkali dalam situasi seperti ini mudah untuk menghasilkan pola wildcard yang cocok dengan file yang relevan.
Dalam kasus Anda, ini hanya
?
(mencocokkan semua nama file dengan tepat satu karakter).Hanya periksa apakah itu benar-benar cocok dengan yang Anda inginkan:
Dan kemudian hapus direktori:
Anda juga dapat menggabungkan ini dengan penyelesaian tab . Anda bisa mengetik
dan tekan tab, dan misalnya dalam bash itu akan digantikan oleh
dan Anda kemudian dapat menekan enter dan itu melakukan apa yang Anda inginkan.
sumber
Anda dapat menggunakan Midnight Commander (mc) untuk menghapus file - cukup pilih dengan tombol atas / bawah dan tekan F8.
Saya melakukannya sesekali ketika nama file memiliki karakter aneh karena penyandian.
sumber
Namun cara lain: gunakan
stat
untuk mendapatkan representasi yang lolos dari nama direktori:Sekarang Anda tahu representasi dari nama file, sehingga Anda dapat menghapus file dengan nama menggunakan
printf
:Atau, jika Anda menggunakan bash, Anda dapat menghindari
printf
:sumber
$'\x03'
lebih sederhana daripada memanggil printf. Hal yang sama untuk FreeBSD sh yang diperluas pada shell POSIX dengan beberapa fitur lezat.$'...'
, tapi saya akan menghindari konversi yang tidak berguna dari oktal ke heksadesimal secara umum. Misalnya bagaimana jika file tersebut dinamai'\111'
(dalamstat
output)? Apakah Anda masih menghapusnya menggunakan$'\x49'
? Lebih baik gunakan urutan yang sama sepertistat
memberi Anda: dalam kasus OPrmdir $'\003'
,.Solusi yang berhasil bagi saya adalah:
untuk menggilir file yang tersedia sampai saya menemukan yang ingin saya hapus.
Tetapi Anda perlu memiliki pengaturan yang diperlukan di shell Anda agar bisa berfungsi.
sumber
Cara termudah adalah memindahkan semuanya ke direktori sementara lalu
rm -r DIRNAME
.sumber
^v
telah bekerja secara konsisten sejak lama.^V
memerlukan pengetahuan khusus saat memindahkan file dan menghapus direktori induk dapat diturunkan dari dasar-dasar.Jika itu satu-satunya direktori kosong (atau Anda tidak peduli menghapus direktori kosong lainnya), gunakan
rmdir */
. Anda akan mendapatkan pesan kesalahan karenarmdir
tidak dapat menghapus direktori yang tidak kosong, tetapi itu tidak masalah.rmdir
Dukungan GNU--ignore-fail-on-non-empty
, atau Anda bisa2>/dev/null
.Trailing
/
membuat glob hanya mencocokkan nama direktori.Anda dapat memeriksa terlebih dahulu direktori kosong apa yang ada di bawah yang sedang digunakan
find -maxdepth 1 -type d -empty -ls
. (Dan Anda dapat mengubah-ls
ke-delete
jika Anda mau).Anda bisa menggunakan ekspresi glob yang lebih spesifik
rmdir [^A-Za-z0-9._]/
untuk mencocokkan direktori yang dimulai dengan nama file non-alfanumerik atau garis bawah. Saya juga termasuk.
, tetapi ekspresi glob tidak cocok secara.
normal.Seperti yang telah ditunjukkan orang lain, Anda dapat membatasi itu untuk nama-karakter tunggal dengan gumpalan
?
:rmdir ?/
rmdir
tidak memiliki-i
pilihan sepertirm
itu, mungkin karena direktori kosong biasanya tidak bernilai dan hanya dapat dibuat ulang.sumber
rmdir
dapat memberi tahu Anda jika Anda memberikan-v
opsi untuk itu (setidaknya di GNU).find -maxdepth 1 -type d -empty -ls
Sebelum melakukan sesuatu yang berisiko, coba ini dulu:
Secara umum - adalah pembatas yang memberitahu perintah no -o pion akan mengikuti, tetapi juga akan memungkinkan karakter aneh untuk tidak ditafsirkan sebagai sesuatu yang lain.
Contoh penggunaan lainnya adalah
whois -r -- "-r OBJECT-RIPE"
(-r adalah jalan pintas untuk matang, tetapi dalam whois matang juga parameter)
Jika tidak berhasil pada percobaan pertama, maka mungkin mencoba
rmdir -- "^C"
Tetapi pada csh shell saya, saya tidak membutuhkannya, hanya
rmdir ^C
sudah bekerja untuk saya.sumber
rmdir
diikuti oleh <ctrl> C berfungsi? Benarkah?! Saya berharap itu berperilaku berbeda, yaitu membatalkanrmdir
perintah dan mengembalikan Anda ke baris perintah.