फ़ाइल नाम में विशेष वर्णों वाली फ़ाइलों को हटा / स्थानांतरित नहीं कर सकता


17

जैसा कि आप नीचे देख सकते हैं कि फाइलों में असामान्य अक्षर हैं।

फ़ाइल प्रबंधक स्क्रीनशॉट

टर्मिनल या डॉल्फिन में उन्हें हटाना त्रुटि देता है:

ऐसी कोई फ़ाइल या डायरेक्टरी नहीं है

ls -laनिर्देशिका पर चलने से मुझे यह आउटपुट मिला:

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

मैंने fsckदूसरे OS से विभाजन पर एक कमांड चलाया, लेकिन यह कुछ भी नहीं बदला।

मैं इन फ़ाइलों को कैसे निकालूँ?


1
क्या आपने एक एन्क्रिप्टेड होम डायरेक्टरी के लिए अपना सिस्टम सेट किया है?
dobey

@dobey मैंने नहीं किया।
कर्जेवादपला

5
@Panther आप गलत हैं। यह वह जगह है नहीं , अपने आप में, एक भ्रष्ट फाइल सिस्टम का एक संकेत है, और भले ही यह था किसी तरह के डाटा में गड़बड़ी की वजह से, ऍफ़एससीके इसके बारे में कुछ नहीं करेंगे।
zwol


1
मेरे पास नाम में अपरिचित चार्टर्स के साथ फाइलें हैं। फाइलों का नाम बदलकर काम किया। तब उन्हें हटाया जा सकता है।
ravery

जवाबों:


35

एक सरल तरीका यह होगा कि इन फ़ाइलों को इनोड द्वारा हटा दिया जाए। :)

उपयोग ls -liप्रत्येक फ़ाइल की इनकोड संख्या दिखाने के लिए असामान्य वर्णों के साथ निर्देशिका में , जैसे,

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

अगला, findसिंटैक्स का उपयोग करके इसके नाम से संबंधित फ़ाइल को हटाने के लिए उपयोगिता का उपयोग करें find <somepath> -inum <inode_number> -exec rm -i {} \;, निम्न उदाहरण में:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

का -iविकल्पrm वास्तव में आवश्यक हो, मैं तो बस गलती से दूर करने फ़ाइलें आप निकालना मतलब नहीं था से आप रखने के लिए उसे नहीं जोड़ा है। :) यह rmप्रत्येक फ़ाइल के लिए पुष्टि करने का कारण बनता है जिसे आप हटाना चाहते हैं।

यदि आप कई फ़ाइलों को उनके इनकोड द्वारा निकालना चाहते हैं, तो आप इसके लिए -o(अर्थ या ) सिंटैक्स का उपयोग कर सकते हैं find:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

आप अधिक -o -inum <inode_number>अभिव्यक्तियों के साथ कोष्ठक में अभिव्यक्ति का विस्तार करके अधिक संख्या जोड़ सकते हैं ।


4
कैसे के बारे में rm -ri .?
ब्रेंट बकाला

यह काम किया: <somepath> -inum <inode_number> -exec rm -i {} \; '-Inum', '{}', और '\' कमांड में क्या करता है?
करजेदवपला

मैं एक बार में कई फाइलें कैसे निकालूं? इसके अलावा, धन्यवाद, आपने मेरा दिन बना दिया!
करजेदवपला 19

2
@BrentBaccala इनोड rm -ri .द्वारा फ़ाइलों को हटा नहीं रहा है, हालांकि। यह पूरी कामकाजी निर्देशिका के माध्यम से फिर से उठेगा और यदि आप इसे हटाना चाहते हैं तो प्रत्येक फ़ाइल के लिए पूछें - और आपको बहुत चौकस रहना होगा कि यह कौन सी फाइलों के लिए पूछ रहा है ताकि गलती से अवांछित लोगों को न हटाएं। मैं निश्चित रूप से अपने होम डायरेक्टरी के लिए इस कमांड का उपयोग नहीं करना चाहूंगा - इसमें बहुत सारी फाइलें हैं। ;)
माल्ट स्कोर्पुपा

3
@karjedavpalaa (1) अपने इनोड संख्या द्वारा फाइलों को देखने के लिए -inumकहता findहै। (2) {}द्वारा पाई गई फ़ाइल से मेल खाता है grep। (३) \ _ उस ;प्रतीक से बच जाता है जो -execविकल्प के लिए पारित कमांड को समाप्त करता है find। (४) मैंने एक ही बार में कई फाइलों को हटाने का तरीका बताने के लिए अपना जवाब संपादित किया है।
माल्टे स्कॉरप्पा

13

यह समझना महत्वपूर्ण है कि यह "फाइलसिस्टम भ्रष्टाचार" की तरह नहीं है जो fsckइसके साथ मदद करेगा। जहाँ तक फाइल सिस्टम का सवाल है, फ़ाइल नाम बाइट्स का कोई भी क्रम हो सकता है , जब तक कि किसी भी बाइट का मान 0x00 (ASCII NUL, C एंड-ऑफ-स्ट्रिंग मार्कर) या 0x2F (नहीं है)/ , निर्देशिका संचालक) न हो। (यदि किसी फ़ाइल का नाम किसी तरह से 00 या 2F बाइट के भीतर मिलता है, fsckतो उसे ठीक करना चाहिए।)

इसके बजाय, आपके पास फ़ाइल नाम हैं जो एप्लिकेशन सॉफ़्टवेयर (डॉल्फ़िन ls) , सोचते हैं कि ऐसे अक्षर हैं जो आपके "लोकेल" में अन-डिस्प्लेेबल हैं , इसलिए यह उन्हें प्लेसहोल्डर वर्णों के साथ बदल रहा है। आप टाइप नहीं कर सकते उन वर्णों को हैं, इसलिए फ़ाइलों में हेरफेर करना कठिन है, लेकिन आप इसे तब तक कर सकते हैं जब तक आप इसे बिना टाइपिंग या कॉपी किए और नाम पेस्ट किए बिना कर सकते हैं। उदाहरण के लिए, यदि आप डॉल्फिन के भीतर से समस्या की फाइलों को सीधे हटा देते हैं या नाम बदल देते हैं, तो बस काम करना चाहिए (मैं यह कहने के लिए इतनी दूर जाऊंगा कि अगर यह काम नहीं करता है, तो डॉल्फिन में एक बग है)।

यदि आपको शेल से उनके बारे में कुछ करने की आवश्यकता है (उदाहरण के लिए, यदि वे स्वामित्व में हैं root और इसलिए उन्हें GUI प्रोग्राम द्वारा संशोधित नहीं किया जा सकता है), तो आप उन्हें "ग्लोब" पैटर्न का उपयोग करके अप्रत्यक्ष रूप से नाम दे सकते हैं, जिसे सही अनुक्रम में विस्तारित किया जाएगा (एस) बाइट्स के साथ और पारित कर दिया।

अब, निश्चित रूप से, आप दुर्घटना से सामान को हटाना नहीं चाहेंगे क्योंकि आपका ग्लोब पैटर्न बहुत अधिक मेल खाता है, इसलिए मेरी सिफारिश renameप्रत्येक फ़ाइलनाम को हेक्स एन्कोडिंग में बदलने के लिए पर्ल उपयोगिता का उपयोग करना होगा :

$ rename '$_ = unpack("H*", $_)' *

यह किसी भी जानकारी को नष्ट नहीं करता है - न तो फ़ाइल ही, न ही जो भी अर्थ मूल रूप से फ़ाइल नाम में एन्कोड किया गया हो, इससे पहले कि वह मंगाई गई हो। यह उदाहरण के लिए विशिष्ट फ़ाइलों के लिए पूर्ववत किया जा सकता है

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

सावधानी: renameअलग-अलग मूल से दो कार्यक्रम हैं ; उपरोक्त आदेश केवल पर्ल के साथ उत्पन्न होने वाले के साथ काम करेंगे। उबंटू में, आप जो चाहते हैं वह "नाम बदलें" पैकेज से है, न कि "उपयोग-लिनक्स" पैकेज से। rename -hभेद करेंगे: यही आप चाहते हैं ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... यह वह नहीं है जो आप चाहते हैं ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

देखने के लिए महत्वपूर्ण बात "पेरलेक्स" है। आपके पास पर्ल नाम का एक पुराना संस्करण हो सकता है जो ऊपर दिए गए सभी विकल्पों को नहीं समझता है, लेकिन मैंने जो कमांड दिखाया वह अभी भी काम करना चाहिए।

संपादित करें: 14.04 .5 अंडर पर्ल स्क्रिप्ट जो इसमें शामिल है rename, -h स्विच का समर्थन नहीं करती है। आप यह पुष्टि कर सकते हैं कि आपके पास यह सही पेज है man rename, जिसमें शीर्ष पंक्ति में किस स्थिति में है:

RENAME (1) पर्ल प्रोग्रामर संदर्भ गाइड RENAME (1)


नाम बदलकर
एल्डर गीक

@ElderGeek क्या file $(which rename)प्रिंट करता है ? (सुनिश्चित करें कि आपके पास fileपैकेज स्थापित है, पहले।)
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/rename( fileडिफ़ॉल्ट रूप से स्थापित किया गया है) वास्तव में आपको प्राप्त करने के लिए प्रतीकात्मक लिंक का पीछा करना होगा /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable लेकिन man renameएक तेज संकेत है ...
एल्डर गीक

@ElderGeek यदि यह एक पर्ल स्क्रिप्ट है, तो यह संभवतः "पर्ल के साथ उत्पन्न होने वाला" का एक पुराना संस्करण है, जो समर्थन नहीं करता है --version; मेरे द्वारा सुझाया गया कमांड अभी भी काम करना चाहिए। मेरे कंप्यूटर पर (ausr/share/doc/ --versionrename/ changelog.gz, जो डेबियन अस्थिर चलाता है, इंगित करता है कि 2013 में पर्ल नाम के संस्करण 0.10 में जोड़ा गया था। मुझे आश्चर्य है कि उबंटू अभी भी उससे कुछ बड़ा है, लेकिन इस कार्यक्रम ने वास्तव में 2007 के बाद से अपनी कार्यक्षमता को नहीं बदला है (इसलिए यह ठीक है।)
zwol

आह! यह उलझन की व्याख्या करता है। इसके विपरीत कई दावों के बावजूद, डेबियन उबंटू नहीं है। मैं हर रिलीज़ के लिए नहीं बोल सकता, लेकिन वर्तमान में उबंटू LTS (14.04) के कुछ समर्थित संस्करण अभी भी नहीं हैं। (हालांकि 16.04 करता है)
एल्डर गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.