سؤال 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


الأصل


انها سيئة للغاية ذلك إدارة الرعاية الاجتماعية لم تجعله في 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
MatteoItalia انها أحرف تحكم سيء للغاية في أسماء الملفات وغيرها أحمق  جعلت الأفكار إلى POSIX ... - pipe


الأجوبة:


^V (السيطرة+الخامس) يعمل كنوع من تسلسل الهروب من أجل الصحافة الرئيسية التالية ، وإدخال القيمة المرتبطة بدلاً من اتخاذ أي إجراء من شأنه أن يرتبط عادة.

الاستفادة من هذا ، ^V^C (السيطرة+الخامس، السيطرة+ج) يجب أن تعمل لإدخال اسم الملف الصعب الخاص بك في المحطة.


189
2018-01-21 16:23



ربما كان هذا هو الأسلوب الذي اتبعته OP في الخطأ المطبعي في المقام الأول. تقع V و C بجوار بعضهما البعض على لوحة المفاتيح. - Stig Hemmer
أو كانوا يحاولون استخدام حافظة Windows على محطة bsd. - Joel Coel
@ عادات JoelCoel لا تموت أبدًا! - Mafii
ومن المثير للاهتمام، ^V^C هل ليس العمل في محرر خط Zsh. ال ونقلت-إدراج القطعة (ابحث في الصفحة عن ^V) صراحة لا يدخل أحرف المقاطعة. قد تكون إجابة جاكوب (باستخدام printf) طريقة أكثر سهولة لتزويد حرف تحكم في وسيطة shell. - Miles
@ StigHemmer: ما يمكن أن يحدث أيضًا هو الضغط على Ctrl-C في منتصف الأمر ، ثم نسيان هذا الأمر ونسخ الأمر لاحقًا. - Mehrdad


يمكنك أيضًا إزالة الملف عن طريق inode:

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

مهما فعلت ، في سبيل الله ، لا تضع -delete قبل -inum:

$ 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؟ هل هذا مجرد إجراء احترازي في حالة الضغط على الدخول قبل الأوان أو هل يؤثر ترتيب الحجج فعليًا على النتيجة؟ - detuur
detuur: النظام يؤثر على النتيجة. انظر تحرير. - bishop
لا تضع -delete في الأمر ، الفترة ، حتى تقوم بتشغيل الأمر بدون -delete للتأكد من أنها تجد ما تريد. - Kaz
Kaz لن يساعد كثيرا مع إضافة-حذف في مركز القيادة - 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
bishop: قف ، لم أكن أعرف ذلك select وجدت ، أنيق جدا! - Matteo Italia
PeterCordes: wops ، لم ألاحظ أننا كنا نتحدث عن الأدلة. أضفت -r (و ./ - من السهل دائما أن تنسى) إلى أمثلتي ، لسوء الحظ rmdir لا يدعم -i العلم. ومع ذلك ، أفترض أن أفضل طريقة للذهاب في هذه الحالة هي مزيج من الأسقف وتعليقك. - Matteo Italia
MatteoItalia select يوجد فقط في بعض الأصداف ، وهذا هو السبب في أنك لم تتعرض لها - النصوص والحلول التي من المفترض أن تكون محمولة تجنبها ، لذلك نحن أقل عرضة لرؤيتها "في البرية". - mtraceur


خيار واحد هو البحث عن اسم الملف مع شيء آخر غير ls. إذا كنت تعرف أنها أنتجت من قبل حرفيا السيطرة+C، يمكنك العثور على الحرف ASCII المنتجة باستخدام جدول شخصيات التحكم، أو مع واجهة أكثر ودية مثل تلك التي تقدمها بايثون:

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

خيار آخر سيكون للنظر في تفريغ عرافة من الناتج ls، على سبيل المثال ، hexdump.

ثم يمكنك حذف الملف باستخدام الأمر bash هذا (على سبيل المثال):

rmdir "$(printf '\x03')"

(لا يلزم وجود علامات الاقتباس المزدوجة إلا إذا كانت الحرف الذي تحاول طباعته موجودًا في IFS متغير ، مثل \x20 أو \x0A، لكنها عادة جيدة لاقتباس استبدالات الأوامر إلا إذا كنت تعرف أنك تريد أن تقوم shell بتقسيم الحقل ، إلخ.)


23
2018-01-21 18:51



أيضا cat -v (زائد man ascii) يمكن أن تساعد للجزء الأول. - Matteo Italia
... أو كنت تستخدم os.rmdir('\x03') مباشرة من قذيفة بايثون. - moooeeeep


في كثير من الأحيان في هذا النوع من الحالات فمن السهل التوصل إلى نمط حرف البدل يطابق الملف المعني.

في قضيتك ، سيكون هذا ببساطة ? (مطابقة جميع أسماء الملفات مع حرف واحد بدقة).

فقط تحقق من أنه يتطابق تمامًا مع ما تريد:

ls -ld ?

ثم قم بإزالة الدليل:

rmdir ?

يمكنك أيضًا دمج هذا مع اكتمال علامة التبويب. يمكنك كتابة

rmdir ?

واضغط على Tab ، وعلى سبيل المثال في باش سيتم استبدالها

rmdir ^C/

ويمكنك بعد ذلك الوصول إلى إدخال وهو يفعل ما تريد.


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’

الآن أنت تعرف تمثيلاً لاسم الملف ، بحيث يمكنك إزالة الملف بالاسم باستخدام printf:

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

أو ، إذا كنت تستخدم bash ، فيمكنك تجنبه printf:

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

7
2018-01-22 10:25



راجع للشغل إذا كانت قذيفة باش ، $'\x03' هو أبسط من استدعاء printf. نفس الشيء بالنسبة لـ FreeBSD sh الممتد عبر shell POSIX مع بعض الميزات اللذيذة. - Netch
Netch نقطة جيدة حول باش $'...'، ولكن يمكنني تجنب التحويل عديم الفائدة من ثماني إلى ست عشري بشكل عام. مثلا ماذا لو تم تسمية الملف '\111' (في stat انتاج)؟ هل لا تزال إزالته باستخدام $'\x49'؟ أفضل استخدام نفس التسلسل stat قدم لك: في حالة OP ، rmdir $'\003'. - Ruslan


الحل الذي عمل بالنسبة لي هو:

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

للتنقل عبر الملفات المتاحة حتى أجدها التي أريد إزالتها.

ولكنك تحتاج إلى الحصول على الإعدادات اللازمة في صدفة لهذا العمل.


6
2018-01-22 08:31



^ C حقًا مبكرًا في تسلسل علامات التبويب حتى +1 لك. - joshudson