שאלה FreeBSD: מדריך שנקרא ^ C (באמת!) - כיצד להסיר?


עשיתי שגיאת הקלדה:

$ history
169 9:34    la /usr/local/etc/
170 9:35    sudo mkdir ^C
171 9:36    sudo mkdir /usr/local/etc/dnsmasq.d

עכשיו יש לי קובץ שנקרא ^ C (ctrl + C) !! כאשר אני משתמש ls אני רק רואה סימן שאלה (כנראה בגלל המקום?)

% 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

ו

% ls -i
3611537 ?   3611534 bin

אני רוצה להסיר את הקובץ הזה. אני מנסה mv וכשהשתמשתי בהשלמת הכרטיסייה הוא מראה לי:

% mv
^C/  bin/

ברור שאני לא יכול להקליד ^ C: - / כיצד ניתן להסיר קובץ זה?


128
2018-01-21 15:55




חבל מאוד dsw לא עשה את זה לתוך POSIX. - Mark Plotnick
@MarkPlotnick: רע מדי ה המקורי  dsw לא עשה את זה לתוך POSIX. - Matteo Italia
אני לא חושב שאתה שם את זה ctrl + C, אתה שם את זה אחרי תו ascii כי ממופה על קיצור המקשים, כלומר ETX (ASCII 3) כנראה. לגופן המסוף שלך אין גליף לאותו תו, ולכן הוא משתמש בגליף חלופי "?". - jiggunjer
emacs -nw -f dired נותן נווט בספרייה. <kbd> D </ kbd> מוחק את הקובץ תחת הסמן לאחר האישור. - Thorbjørn Ravn Andersen
@MteteoItalia זה תווים שליטה רעה מדי בשמות קבצים אחרים אידיוטי  רעיונות עשה את זה POSIX ... - pipe


תשובות:


^V (ctrl+v) עובד כסוג של רצף בריחה עבור המפתח הבא הקש, הוספת הערך המשויך במקום לנקוט פעולה כלשהי כי בדרך כלל להיות משויך.

לעשות שימוש זה, ^V^C (ctrl+v, ctrl+c) צריך לעבוד על הזנת שם הקובץ הקשה שלך במסוף.


189
2018-01-21 16:23



זה היה כנראה איך OP עשה הקלדת שלהם מלכתחילה. V ו- C נמצאים ממש ליד המקלדת. - Stig Hemmer
או שהם ניסו להשתמש בלוח של Windows על מסוף bsd. - Joel Coel
הרגלים @JoelCoel אף פעם לא למות! - Mafii
מעניין, ^V^C עושה לא עבודה בעורך קו Zsh; ה מצטט (חפש את הדף עבור ^V) במפורש אינו מוסיף תווים פסיקה. התשובה של Jakob (באמצעות printf) עשויה להיות דרך ניידת יותר לאספקת אופי בקרה בארגומנט פגז. - Miles
@StigHemmer: מה יכול לקרות גם אתה לוחץ Ctrl-C באמצע הפקודה, ואז לשכוח את זה להעתיק ולהדביק את הפקודה מאוחר יותר. - Mehrdad


ניתן גם להסיר את הקובץ על ידי inode:

$ ls -i1
290742 foo
293246 ^C
$ find . -inum 293246 -delete

מה שלא תעשה, למען השם, אל תשים -delete לפני -inumYou

$ touch foo bar baz quux
$ find . -name '*u*' -delete
$ ls
bar baz foo
$ find . -delete -name 'b*'
find: `./baz': No such file or directory
find: `./bar': No such file or directory
$ ls
$ 

ברכותי, פשוט מחקת את כל הקבצים שלך. עם find, ענייני סדר!


89
2018-01-22 03:42



למה לא לשים -delete לפני -inum? האם זה רק אמצעי זהירות במקרה שתלחץ על Enter בטרם עת או האם הסדר של הטיעונים אכן משפיע על התוצאה? - detuur
@detuur: הסדר משפיע על התוצאה. ראה עריכה. - bishop
אל תשים -delete לתוך הפקודה, נקודה, עד שתפעיל את הפקודה ללא -deleteכדי לבדוק שהוא מוצא את מה שאתה רוצה. - Kaz
@Kaz לא יעזור הרבה עם הוספת -delete במרכז הפיקוד - RiaD
@Kaz באמצעות -print במקום -delete עושה מבחן טוב מאוד. - Mark Ransom


אפשרות נוספת היא להשתמש rm -ri ./*; rm ישאל אותך לפני מחיקת כל קובץ וספרייה, אז אתה רק צריך לענות y לקובץ "רע" ו n לכל האחרים.

למעשה, במקרה שלך אתה יכול אפילו לצמצם את מספר התשובות הנדרשות על ידי עושה rm -ri ./?, כמו שלך "רע" הקובץ הוא רק תו אחד.


31
2018-01-21 20:13



select f in ?; do rm -i "$f"; break; done יש את כל היתרונות של -i, ללא ייסורי הצורך לענות no כדי לא רצויות מובילות או לענות בטעות כן אחד שאתה רוצה לשמור. - bishop
במקרה של OP זה ספרייה, לא קובץ. rmdir ?/ תסיר את כל הספריות ריקות אופי יחיד, ולהתלונן על האחרים להיות ריק. - Peter Cordes
@ בישופ: whoa, אני אפילו לא יודע את זה select היה קיים, די מסודר! - Matteo Italia
@ PeterCordes: wops, לא שמתי לב שאנחנו מדברים על ספריות; הוספתי -r (ו ./ - זה תמיד קל לשכוח) לדוגמאות שלי, למרבה הצער rmdir אינו תומך -i דגל. ובכל זאת, אני מניח שבמקרה זה הדרך הטובה ביותר ללכת תהיה שילוב של הבישוף ואת ההערה שלך. - Matteo Italia
@MteteoItalia select קיים רק בכמה פגזים, וזה כנראה למה אתה לא נתקל בו - סקריפטים ופתרונות שנועדו להיות ניידים למנוע את זה, ולכן אנחנו פחות סיכוי לראות את זה "בטבע". - mtraceur


אפשרות אחת היא לחפש את שם הקובץ עם משהו אחר ls. אם אתה יודע שזה היה מיוצר על ידי מילה במילה Ctrl+ג, אתה יכול למצוא את אופי ASCII המיוצר באמצעות טבלה של תווים שליטה - -, או עם ממשק ידידותי יותר כמו זה שסופק על ידי Python:

>>> import os
>>> os.listdir('.')
['\x03', ...]

אפשרות נוספת תהיה להסתכל על dx hex של הפלט של ls, באמצעות למשל hexdump.

לאחר מכן תוכל למחוק את הקובץ באמצעות פקודת bash זו (לדוגמה):

rmdir "$(printf '\x03')"

(ציטוטים כפולים נדרשים רק אם הדמות שאתה מנסה להדפיס היא שלך IFS משתנה, כגון \x20 או \x0A, אבל זה הרגל טוב לצטט חילופי פקודות אלא אם כן אתה יודע שאתה רוצה את הקליפה לבצע פיצול שדה, וכו '


23
2018-01-21 18:51



כמו כן cat -v (ועוד man ascii) יכול לעזור עבור החלק הראשון. - Matteo Italia
... או שאתה משתמש os.rmdir('\x03') ישירות מקליפת פיתון. - moooeeeep


לעתים קרובות במצבים כאלה קל לבוא עם דפוס כלליים התואם את הקובץ הרלוונטי.

במקרה שלך, זה יהיה פשוט ? (התאמת כל שמות הקבצים עם תו אחד בדיוק).

רק לבדוק שזה באמת תואם את מה שאתה רוצה:

ls -ld ?

ולאחר מכן הסר את הספריה:

rmdir ?

ניתן גם לשלב את זה עם השלמת טאב. אתה יכול להקליד

rmdir ?

ולחץ על הכרטיסייה, וכן. ב bash זה יוחלף על ידי

rmdir ^C/

ואז אתה יכול ללחוץ על Enter וזה עושה מה שאתה רוצה.


15
2018-01-21 21:02





ניתן להשתמש ב- Midnight Commander (mc) כדי למחוק את הקובץ - פשוט לבחור בלחצנים מעלה / מטה ולחץ על F8.

עשיתי את זה מדי פעם כאשר שמות הקבצים היו תווים מוזרים עקב קידוד.


11
2018-01-21 20:29



או כמעט כל מנהל קבצים אחר. - Stig Hemmer
@StigHemmer כמובן, יש לעשות יותר טוב מאשר אחרים עבור הצגת שמות קבצים מסוימים. כנראה התשובה יכולה להסביר מדוע MC הוא בחירה אופטימלית לעומת כמה לבחור אחרים. לא הייתי יודע, כי מעולם לא השתמשתי בו. - can-ned_food


דרך נוספת: להשתמש stat כדי לקבל ייצוג נמלט של שם המדריך:

$ stat *|grep File:
  File: ‘\003’

עכשיו אתה יודע ייצוג של שם הקובץ, כך שתוכל להסיר את הקובץ לפי שם משתמש printfYou

$ rmdir -v "$(printf '\003')"
rmdir: removing directory, ‘\003’

לחלופין, אם אתה משתמש bash, אתה יכול להימנע printfYou

$ rmdir -v $'\003'
rmdir: removing directory, ‘\003’

7
2018-01-22 10:25



BTW אם פגז הוא bash, $'\x03' הוא פשוט יותר מאשר קורא printf. אותו דבר עבור FreeBSD ש המורחבת מעל פגז POSIX עם כמה תכונות טעימות. - Netch
@ נקודה טובה על באש $'...', אבל אני ימנע המרה מיותרת מ octal כדי הקסדצימלי בכלל. למשל מה אם שם הקובץ נקרא '\111' (ב stat פלט)? האם עדיין תסיר אותו באמצעות $'\x49'? עדיף להשתמש באותו רצף כמו stat נתן לך: במקרה של OP, rmdir $'\003'. - Ruslan


פתרון שעבד בשבילי הוא:

rm ./[Tab][Tab][Tab]...

כדי לעבור בין הקבצים הזמינים עד שאמצא את הקובץ שברצונך להסיר.

אבל אתה צריך לעשות את זה ההגדרות הדרושות בקליפה שלך כדי שזה יעבוד.


6
2018-01-22 08:31



^ C הוא ממש מוקדם ברצף הכרטיסייה כך +1 בשבילך. - joshudson


הדרך הקלה ביותר היא להעביר הכל לספרייה זמנית ולאחר מכן rm -r DIRNAME.


5
2018-01-21 16:31



האם זה באמת נראה לך קל יותר מאשר התשובה המקובלת? - chicks
@chicks: הוא למעשה לא כזה תשובה רעה. ראיתי כבר לא עובד כדי שמישהו עלול להיתקע. - joshudson
זה לא בסדר כשלעצמו, אבל זה נראה כמו הרבה עבודה נוספת לעומת פתרונות ישירים יותר. אולי אני מקולקל על ידי לינוקס, אבל ^v עבד בעקביות אותי במשך הגילאים. - chicks
@chicks ^V צריך ידע ספציפי בעת העברת קבצים סביב והסרה של ספריית האב יכול להיגזר מן היסודות. - Kondybas
Ctrl + V הוא מסוכן למדי בהתאם לסביבת העבודה המדויקת שלך ... כמה emulators מסוף יכול לפרש את זה כמו להדביק. אם המאגר הדבק שלך מכיל את השם של משהו שאתה לא רוצה למחוק - ואת newline, אתה יכול להיות מסתכל על בעיה. - rackandboneman


אם זה הספרייה הריקה היחידה (או לא אכפת לך להסיר ספריות ריקות אחרות), להשתמש rmdir */. תקבל הודעות שגיאה מ rmdir על לא להיות מסוגל להסיר ספריות שאינן ריקות, אבל זה בסדר. גנו rmdir תומך --ignore-fail-on-non-empty, או שאתה יכול 2>/dev/null.

נגרר / עושה את גלובוס רק התאמה שמות הספרייה.

אתה יכול לבדוק מראש מה ספריות ריקות קיים תחת הנוכחי באמצעות
find -maxdepth 1 -type d -empty -ls. (ואתה יכול לשנות את -ls ל -delete אם אתה רוצה).

אתה יכול להשתמש בביטוי גלובלי ספציפי יותר כמו rmdir [^A-Za-z0-9._]/ כדי להתאים לספריות שמתחילות בשם קובץ לא אלפאנומרי או תחתון. כללתי גם כן ., אבל ביטויים גלובליים אינם תואמים . בדרך כלל בכל מקרה.


כפי שציינו אחרים, אתה יכול להגביל אותו לשמות חד אופי עם גלובוס של ?You rmdir ?/

rmdir אין -i אפשרות הדרך rm עושה, כנראה בגלל מדריכים ריקים הם בדרך כלל לא בעל ערך והוא יכול פשוט להיות מחדש.


1
2018-01-22 05:39



אתה רוצה לדעת אילו ספריות אתה רוצה לשחזר, ו rmdir יכול להגיד לך אם אתה עובר -v (לפחות בגנו). - Ruslan
@Ruslan: לא אם היו לך ספריות מעופש אחרים אתה כבר לא אכפת, והסרת אותם יהיה בונוס. אתה יכול לחפש ספריות ריקות עם find -maxdepth 1 -type d -empty -ls - Peter Cordes