विशेष प्रथम वर्ण वाले फ़ाइल नामों के साथ व्यवहार करना (उदा।)


30

मैं हाल ही में एक फाइल लेकर आया हूं जिसका नाम '♫' अक्षर से शुरू होता है। मैं इस फाइल को कॉपी करना चाहता था, इसे फीड करना चाहता था ffmpeg, और टर्मिनल में विभिन्न अन्य तरीकों से इसका संदर्भ देता था। मैं आमतौर पर अजीब फ़ाइलनामों को स्वतः पूर्ण करता हूं लेकिन यह विफल रहता है क्योंकि मैं पहला अक्षर भी नहीं लिख सकता।

मैं कॉपी-पेस्ट पैंतरेबाज़ी करने के लिए माउस पर स्विच नहीं करना चाहता। मैं संभावित परिदृश्यों के लिए कोड का एक गुच्छा याद नहीं करना चाहता। मेरे तदर्थ समाधान को प्रश्न में चरित्र को स्विच vim, पेस्ट !lsऔर कॉपी करना था, फिर टर्मिनल में छोड़ दिया और पेस्ट किया। यह काम किया लेकिन काफी भयावह है।

क्या ऐसे परिदृश्यों से निपटने का एक आसान तरीका है?

ध्यान दें: मैं मछली शेल का उपयोग कर रहा हूं अगर यह चीजों को बदलता है।


7
क्या आप इसके साथ काम करने के लिए regex बनाने के लिए फ़ाइल के अन्य भागों का उपयोग कर सकते हैं? *restoffile.aviया इस तरह का कुछ?
स्लम

1
इस मामले में शेष नाम कांजी और कटकाना (जापानी स्क्रिप्ट) का मिश्रण था, इसलिए आसानी से नहीं।
ZirconCode 13

3
समझ गया, बस सोचा था कि मैं पूछूंगा। क्या जिमीज का जवाब इससे हल होता है? इसके अलावा आप क्या आपत्तिजनक फ़ाइलों का एक स्क्रीनशॉट चिपकाने का मन करेगा? यह संभवतः दूसरों के लिए उपयोगी होगा जो बाद में इसे पढ़ सकते हैं।
स्लम

1
मैं इसे अभी काम करने के लिए प्राप्त करने की कोशिश कर रहा हूं। मैं नहीं जानता कि कैसे एक पटकथा पोस्ट करने के लिए, लेकिन निम्नलिखित आदेशों को चलाने से आपको मेरी समस्या का touch '♫ 漢字カ' touch '♫ 漢字タ'
सामना करना पड़ेगा

1
Zsh के साथ आप टैब का उपयोग करने के लिए विकल्पों का उपयोग कर सकते हैं जिससे आप एक उपयुक्त फ़ाइल का चयन कर सकते हैं।
केविन

जवाबों:


35

यदि फ़ाइल नाम का पहला वर्ण मुद्रण योग्य है, लेकिन न तो अल्फ़ान्यूमेरिक और न ही व्हाट्सएप आप [[:punct:]]ग्लोब ऑपरेटर का उपयोग कर सकते हैं :

$ ls *.txt
f1.txt  f2.txt  ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt

हम्म मैं इन ग्लोब ऑपरेटरों के बारे में नहीं जानता था, मैंने उन पर पढ़ा और थोड़ा सीखा (धन्यवाद), यह समस्या को हल करता है जो मेरे पास एक अजीब फ़ाइल थी जो मेरे dir में है। अब मुझे इस समस्या का एक बड़ी भीड़ के साथ सामना करना पड़ता है। फ़ाइलें, क्या मुझे एक नया प्रश्न पूछना चाहिए या इसे अपडेट करना चाहिए?
ZirconCode 13

मैंने आपका उत्तर स्वीकार कर लिया है, मैं कल दूसरा परिदृश्य पोस्ट करूंगा जब मेरे पास समय होगा। सहायता के लिए धनयवाद।
ZirconCode

6

मेरे लिए सबसे सरल है ls [^a-zA-Z0-9]*और यह मेरे लिए चाल है, लेकिन एग्ग्लोब शेल विकल्प या यहां तक ​​कि शेल-स्वतंत्र दृष्टिकोण पर ध्यान देने में टेर्डन का जवाब बेहतर है।


यह उस पर एक सभ्य-पर्याप्त छुरा है। आप ls [^[:alnum:]]*एक ही बात के लिए कर सकते हैं । लेकिन चरित्र वर्ग का उपयोग करना बेहतर है , न कि कक्षा के बजाय यह है ; इसलिए ls [[:punct:]]*इस फ़ाइल को सूचीबद्ध करेगा।
रिच

6

ls के पास कुछ स्विच हैं (जैसे --quote-name, --escape, --literal) जो कि अनपेक्षित वर्णों से निपटने के लिए है, लेकिन इस मामले में ऐसा लगता है कि चरित्र "प्रिंट करने योग्य" है, लेकिन "टाइप करने योग्य" नहीं है (कम से कम मेरे कीबोर्ड पर! ), इसलिए इनमें से कोई भी स्विच मदद नहीं करता है।

इसलिए, उनके नाम के किसी भी वर्ण के साथ फ़ाइलों से छुटकारा पाने के लिए एक सामान्य "जानवर बल" दृष्टिकोण के रूप में, आप यह कर सकते हैं:

$ /bin/ls -1A|cat -n  # list all files (except . and ..), 1 per line, add line numbers
     1  ♫
     2  f1.txt
     3  f2.txt

आपत्तिजनक फ़ाइल वाली लाइन का पता लगाएं। काफी संभावना है कि यह पहली पंक्ति होगी, लेकिन मान लें कि यह 5 वीं है। प्रिंट लाइन 5 और हेक्स इसे एनकोड करते हैं:

$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a                                      ....

0a (newline) वर्ण को अनदेखा करना, एक भागने स्ट्रिंग का निर्माण करना, और पलायन का अनुवाद करने के लिए गूंज के -e विकल्प का उपयोग करें:

$ echo -e '\xe2\x99\xab'
♫

अब आप इसे इस तरह से कॉपी / मूव / डिलीट कर सकते हैं:

$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’

इसके अलावा, यदि आप शेल स्क्रिप्ट का उपयोग करने के लिए सीमित नहीं हैं, तो आप इसे इस तरह से पायथन में कर सकते हैं:

$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')

इस दृष्टिकोण का उपयोग करते हुए, आप कई फ़ाइलों को संसाधित कर सकते हैं, आपको बस सही फ़ाइलों का चयन करने के लिए तर्क लिखना होगा, और उन्हें क्लॉबरिंग के बिना नाम बदलना, आदि:

for f in os.listdir('.'):
  if not f.isalnum():
    newname = generate_newname(f)
    if not os.path.exists(newname):
      shutil.copy(f, newname)
    else:
      print newname, 'already exists!'

5

एक समान दृष्टिकोण उन सभी फाइलों को सूचीबद्ध करना होगा जो "सामान्य" वर्णों से शुरू नहीं होती हैं। बैश में आप इसके साथ कर सकते हैं

$ shopt -s extglob
$ ls !([[:alpha:]]*)

हालाँकि, यह उपलब्ध नहीं लगता है fish, इसलिए आप findइसके बजाय उपयोग कर सकते हैं :

$ find . -type f -not -name '[[:alpha:]]*'

4

सहानुभूति का नाम बदलें

विशेष वर्णों के साथ फ़ाइल नामों को संभालने के लिए एक दृष्टिकोण - जैसा कि पहले वर्ण या फ़ाइल नाम में कहीं भी सरल नामों का नाम बदलना है

इसका उपयोग तब भी किया जा सकता है जब आपको मूल फ़ाइल नाम रखने की आवश्यकता होती है : फ़ाइलनाम की एक प्रतिलिपि का नाम बदलें।
यह फ़ाइलों की प्रतिलिपि बनाकर किया जा सकता है, लेकिन फ़ाइलों में सहानुभूति या हार्डलिंक बनाकर और इनका नाम बदलकर भी किया जा सकता है । cpविकल्प के साथ प्रतियों के बजाय -s( -lहार्डलिंक के लिए) सहानुभूति बनाता है ।

नामों को साफ करने के लिए "डिटॉक्स" का उपयोग करें

फ़ाइल नामों को साफ़ करने के लिए, detoxइसका उपयोग किया जा सकता है; यह एक detoxrcफाइल में परिभाषित विभिन्न नियमों के अनुसार फाइल नामों को साफ करने के लिए फाइलों का नाम बदल देता है । डिफ़ॉल्ट रूप से, UTF8 वर्ण अभी हटा दिए गए हैं; विकल्प के साथ -s utf_8-onlyउन्हें बदल दिया जाता है _:

$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only * 
$ ls -1                
_ ___
_foo


सिम्बलिंक्स पर "डिटॉक्स"

ऊपर वर्णित की तरह सहानुभूति पर काम करने के साथ संयुक्त:

$ mkdir orig
$ cd orig 
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean 
$ cp -s ../orig/* .
$ ll               
lrwxrwxrwx 1 14 Oct  8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct  8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll                                
lrwxrwxrwx 1 21 Oct  8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct  8 05:52 _foo -> ../orig/♫foo

2

मैं उपयोग नहीं करता fish, लेकिन प्रलेखन कहता है कि आप \u(16-बिट वर्णों के लिए) या \U(32-बिट वर्णों के लिए) इसके हेक्स वर्ण कोड को प्रीफ़िक्स करके एक यूनिकोड वर्ण दर्ज कर सकते हैं । मुझे लगता है कि यह कोड है 491eb, इसलिए आप ऐसा कर सकते हैं:

mv \U000491ebabc.mp3 abc.mp3

नाम बदलना ♫abc.mp3

ध्यान दें कि आपको अग्रणी शून्य की आवश्यकता है, अन्यथा abcअंत में हेक्स अंकों के रूप में माना जाएगा, और चरित्र कोड का हिस्सा; 32-बिट वर्ण के लिए आपको 8 अंक दर्ज करने की आवश्यकता है।


2

मुझे नहीं पता कि यह 2014 का मामला था जब आपने सवाल पूछा था, लेकिन fish(2019 के अनुसार) के वर्तमान संस्करणों में , आप Tabदो बार प्रेस कर सकते हैं , एक ज़ीश-शैली का चयन करने के लिए जहां आप तीर कुंजियों का उपयोग कर सकते हैं फ़ाइल नाम के किसी भी भाग को टाइप किए बिना अपनी इच्छित फ़ाइल का चयन करें।


2

मछली डिजाइन द्वारा ब्रैकेट वाइल्डकार्ड et का समर्थन नहीं करती है ।

function find_special_filename
    find ! -path './.*' -name '[^-.a-zA-Z0-9_]*' $argv
end

आदेश छिपा निर्देशिका और प्रदर्शित करता है फ़ाइल नाम है कि पात्रों के साथ शुरू नहीं करते में खोज नहीं करता letters, digits, . _ -(के प्रलेखन सीएफ find)।

नोट: $argv एक विशेष सरणी चर (फिश शेल) है जिसमें फ़ंक्शन आर्गुमेंट होते हैं इसलिए अंतर्निहित कमांड को कोई भी अभिव्यक्ति मिल सकती है (जैसे उपनाम )।

find_special_filename -exec mv '{}' misc/ \;

¹ वास्तव में, मछली ब्रैकेट विस्तार (सरणी चर विस्तार) का समर्थन करता है लेकिन बैश एक और शब्दावली (पैरामीटर और फ़ाइल नाम विस्तार) का उपयोग करता है।



0

आपने यह नहीं कहा कि क्या आप इन समस्याग्रस्त फ़ाइलनामों को रखना चाहते हैं। एक समस्या यह है कि आप इस स्क्रिप्ट को चलाकर टाइप कर सकते हैं, नाम के लिए अपनी फ़ाइलों को (कुछ या सभी) नाम बदलने के द्वारा एक बार और सभी के लिए समस्या को "ठीक" करें।

#!/bin/sh
for old in *
do
      printf "%s ...? " "$old"
      if read new  &&  [ "$new" != "" ]
      then
             mv -i "$old" "$new"
      fi
done

यह आपके मौजूदा फ़ाइलनामों की सूची देगा, प्रत्येक के बाद ...?। बस टाइप Enterएक फ़ाइल को छोड़ने के लिए है के रूप में; या इसका नाम बदलने के लिए एक नया नाम लिखें। -iविकल्प यह ओवरराइटिंग पुष्टि करने के लिए यदि आप किसी अन्य मौजूदा फ़ाइल का नाम निर्दिष्ट आप से पूछना करने के लिए कारण होगा।

इस लिपि को कई तरीकों से संशोधित किया जा सकता है:

  • आप वाइल्डकार्ड ( *) को कुछ अधिक प्रतिबंधक, जैसे, को संशोधित कर सकते हैं *.avi *.mov, इसलिए आपको हर फ़ाइल को देखने की आवश्यकता नहीं है।
  • आप को बदल सकता है mvकरने के लिए cpहै, तो आप अपने वर्तमान नाम के साथ फ़ाइल की एक प्रतिलिपि रखने के लिए और एक बनाने के (अस्थायी?) एक typeable नाम के साथ नकल।
  • आप एक नया फ़ाइल नाम बना सकते हैं जो मौजूदा फ़ाइल नाम पर आधारित है। उदाहरण के लिए,

    if read pfx  &&  [ "$pfx" != "" ]
    then
            mv -i "$old" "$pfx$old"
    fi
    

    जो आपको पुराने नाम के सामने एक उपसर्ग देता है। यदि आपने एक अद्वितीय उपसर्ग चुना है, तो यह आपको ऑटो-पूर्ण का उपयोग करने देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.