मैं ls और mv के साथ ms-dos शैली वाइल्डकार्ड का उपयोग कैसे कर सकता हूं?


9

मुझे MS-DOS पृष्ठभूमि से आने का दुर्भाग्य है - लेकिन कम से कम यह मुझे सराहना देता है कि लिनक्स कितना शक्तिशाली है। मैं अपने लिनक्स-फू को बराबर करने पर काम कर रहा हूं, लेकिन कुछ चीजें हैं जो डॉस के साथ की जा सकती हैं, मुझे यकीन नहीं है कि लिनक्स के साथ सबसे आसानी से कैसे पूरा किया जाए :

एकाधिक फ़ाइलों का नामकरण - दो वाइल्डकार्ड का उपयोग करना

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\>rename *.txt *.bak

c:\> dir

Directory of c:\
    file1.bak
    file2.bak
    file3.bak
    file4.bak

मुझे पता है कि मैं find -execयहां इस्तेमाल कर सकता हूं, लेकिन एक छोटे सिंटैक्स का उपयोग करना संभव है - शायद mvकुछ विशेष झंडे या सिंटैक्स के साथ? मुझे लगता है कि यह दूसरी * वाइल्डकार्ड है क्योंकि लिनक्स में पहले वाले के साथ कोई समस्या नहीं होनी चाहिए (यानी मुझे पता है कि मुझे उन फ़ाइलों का चयन कैसे करना है जिनका मैं वाइल्डकार्ड का उपयोग करके नाम बदलना चाहता हूं)

एक फ़ाइल का नामकरण - एक वाइल्डकार्ड का उपयोग करना

c:\> dir

Directory of c:\
    file1.txt

c:\>rename file1.txt *.bak

c:\> dir

Directory of c:\
    file1.bak

यह लंबी और अनकही फ़ाइल नामों का नाम बदलने पर विशेष रूप से उपयोगी होगा। मैंने सोचा कि शायद मैं इसका उपयोग mv file1.txt $1.bakकरने के लिए उपयोग कर सकता हूं file1.txt.bakजो स्वीकार्य भी होगा लेकिन मुझे यकीन नहीं है कि आप $1शेल कमांड के साथ एक पैरामीटर इनलाइन का संदर्भ दे सकते हैं । इस विशेष मामले में फिर से यह सुविधाजनक है कि *फ़ाइलनाम के भाग के लिए ms-dos वाइल्डकार्ड को किस तरह से कैप्चर / रिप्लेस मैच के रूप में उपयोग किया जा सकता है।

एक वाइल्डकार्ड के साथ निर्देशिका लिस्टिंग को फ़िल्टर करना

c:\> dir

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt
    text.txt
    \temp       (directory) 

c:\> dir file*

Directory of c:\
    file1.txt
    file2.txt
    file3.txt
    file4.txt

c:\> t*

Directory of c:\
    text.txt
    \temp       (directory) 

मुझे यकीन नहीं है कि ऐसा करने के लिए सही सिंटैक्स क्या lsहै, या यदि यह संभव है। अगर मैंने ऐसा कुछ किया, तो ls t*यह उन निर्देशिकाओं में फिर से शुरू हो जाएगा, जो शुरू होती हैं t। मेरा वर्कअराउंड या तो उपयोग कर रहा है find . --max-depth 1 -iname "t*"या जैसे कुछ ls -al | grep t- जिसमें से कोई भी छोटा और सरल नहीं dir t*है।

अंत में, मुझे पता है कि मैं इन लंबे आदेशों को कम करने के लिए उपनाम सेट कर सकता हूं, लेकिन मैं इन चीजों को करने के लिए कुछ आउट-ऑफ-द-बॉक्स लिनक्स-फू सीखना चाहूंगा क्योंकि कभी-कभी आप एक रिमोट सिस्टम या काम से जुड़े होते हैं एक नई मशीन पर।

तो मैं कैसे mvऔर lsफ़ाइलों को उसी तरह से कर सकता हूं जो मैं dirऔर renameफाइलों के लिए करता था?

जवाबों:


15

विंडोज cmdऔर पोसिक्स गोले के बीच मूलभूत अंतरों में से एक वाइल्डकार्ड विस्तार के लिए जिम्मेदार है। गोले आपके द्वारा पूछे गए वास्तविक आदेशों को शुरू करने से पहले आवश्यक सभी विस्तार करते हैं। cmd ज्यादातर अनमॉडिफाइड कमांड के वाइल्डकार्ड पैटर्न को पास करता है। (मैं ज्यादातर कहता हूं, क्योंकि मुझे लगता है कि अपवाद हैं, और अधिकांश परिस्थितियों में पर्यावरण चर का विस्तार किया जाता है।) यह एक renameऐसा वाक्य बनाता है जो उसी वाक्यविन्यास के साथ काम करेगा जैसा कि cmdकाफी मुश्किल है।

लेकिन renameलिनक्स के लिए एक है - पूरी तरह से अलग-अलग तर्कों के साथ, मैन पेज देखें (जो कि मेरे सिस्टम पर थोड़ा सा ट्रोल है, और मेरे सिस्टम पर पैकेज renameसे आता util-linuxहै, जो व्यापक रूप से उपलब्ध होना चाहिए)। आपका पहला नाम इस तरह किया जाएगा:

rename .txt .bak *.txt

ध्यान दें कि शेल *विस्तार करता है , इसलिए renameस्वयं वास्तव में सोचता है कि इसे इस तरह से लागू किया गया था:

rename .txt .bak file1.txt file2.txt file3.txt ...

तो आप एकल फ़ाइल संस्करण का अनुमान लगा सकते हैं:

rename .txt .bak file1.txt

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

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfileमूल एक्सटेंशन को हटाने के लिए एक सबस्ट्रिंग हटाने का उपयोग करके बनाया गया है , फिर नए एक्सटेंशन को संक्षिप्त करता है। आप अपेक्षाकृत आसानी से कई फ़ाइलों को संभालने के लिए उस फ़ंक्शन का विस्तार कर सकते हैं।


अपने lsप्रश्न के लिए, -dस्विच का उपयोग करें। यह lsनिर्देशिका की सामग्री को सूचीबद्ध करने से रोकेगा ।

डेमो:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

वाइल्डकार्ड नाम

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

एकल-फ़ाइल का नाम

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

डिफ़ॉल्ट ls

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls यह निर्देशिकाओं का निरीक्षण नहीं करता है

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

बहुत अच्छा! मुझे लगता है कि मैं सिर्फ अपने linux- फू के साथ एक बेल्ट ले जाया गया है! धन्यवाद!
cwd

इस के साथ थोड़ी प्रगति करने के लिए टिप (और नुकसान से बचने के लिए): साधारण कार्य या स्क्रिप्ट का उपयोग करके देखें कि जब आप ऐसा करते हैं somefunc *.Extतो क्या होता है यदि वह पैटर्न किसी भी फ़ाइल से मेल नहीं खाता है, और यह देखने के लिए कि क्या आप किसी पैटर्न को पास करने का प्रबंधन करते हैं, के साथ खेलते हैं ( कार्यों के बीच इसे विस्तारित किए बिना)। सुरक्षा टिप: ग्लोबिंग / शेल विस्तार के साथ प्रयोग करते समय कहीं भी उपयोग करें rm:-)
Mat

4

वाइल्डकार्ड की बात आने पर एक बात ध्यान रखें कि वे शेल द्वारा विस्तारित हैं। एप्लिकेशन को पता नहीं है कि आपने वाइल्डकार्ड का उपयोग किया है या नामों को टाइप किया है। उदाहरण के लिए, यदि आप टाइप करते हैं rename *.txt *.bak, तो renameकमांड कुछ देखता है rename file1.txt file2.txt existingfile.bak। यह पर्याप्त जानकारी नहीं है।

मैं lsपहले के बारे में सवाल से निपटूंगा, क्योंकि यह सरल है। यदि आप चाहते हैं कि सभी मिलान नाम हैं, तो आपको ज़रूरत नहीं है ls, क्योंकि शेल पहले से ही विस्तार कर रहा है।

echo t*

यदि आप फ़ाइलों के बारे में अधिक जानकारी चाहते हैं, तो -dविकल्प को पास करें ls, यह बताएं कि निर्देशिका की सामग्री को सूचीबद्ध न करें।

ls -ld t*

फ़ाइलों का नाम बदलने के लिए कोई मानक उपयोगिता नहीं है, क्योंकि पहले यूनिक्स सिस्टम एक के साथ नहीं आए थे। फ़ाइलों का नाम बदलने के लिए पोर्टेबल विधि एक लूप का उपयोग करती है और थोड़ी सी क्रिया होती है:

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

फ़ाइलों का नाम बदलने के लिए कई सामान्य उपयोगिताओं हैं, जिनमें से किसी को भी दी गई यूनिक्स प्रणाली पर स्थापित करने की गारंटी नहीं है, लेकिन सभी को स्थापित करना आसान है। यहाँ मुख्य हैं:

  • renameसे util-linuxसूट, हर गैर एम्बेडेड Linux सिस्टम (और कहीं नहीं) पर उपलब्ध है। डेबियन और डेरिवेटिव (उबंटू सहित) पर, इस कमांड को कहा जाता है rename.ul। बशर्ते कि .txtअंतिम विस्तार के अलावा कोई घटना न हो , आप लिख सकते हैं

    rename .txt .bak *.txt
    
  • renameएक पर्ल स्क्रिप्ट है जो डेबियन और डेरिवेटिव शिप के रूप में है /usr/bin/rename। आप मनमाने ढंग से पर्ल कमांड के अनुसार फाइलों का नाम बदल सकते हैं।

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv, जो कई नाम-आधारित पैटर्नों के अनुसार फ़ाइलों का नाम बदल, कॉपी और लिंक कर सकता है और यदि कोई लक्ष्य नाम पहले से मौजूद है, तो इससे संबंधित कई विकल्प हैं। ध्यान दें कि आप वाइल्डकार्ड को शेल द्वारा विस्तार से बचाने के लिए उद्धरणों का उपयोग करें।

    mmv '*.txt' '#1.txt'
    
  • zmvएक zsh फ़ंक्शन है, यदि केवल और केवल यदि आपका शेल zsh है तो उपलब्ध है। यह मनमाने ढंग से zsh पैटर्न से मेल खा सकता है (इसलिए आप मनमाने ढंग से नियमित भावों के अनुसार फाइल के नामों का मिलान कर सकते हैं, न कि केवल वाइल्डकार्ड्स से, और आप अन्य मानदंडों जैसे तारीखों और आकारों द्वारा फाइलों का मिलान कर सकते हैं)। zmvकॉपी और लिंक भी कर सकते हैं।

    zmv '(*).txt' '$1.txt'
    

यदि आप अपने द्वारा उपयोग की जाने वाली मशीनों पर कुछ नियंत्रण रखते हैं, तो मेरी सलाह है कि अपने शेल के रूप में zsh का उपयोग करें (यह बैश पर अन्य लाभ हैं) और इन पंक्तियों को अपने में रखें ~/.zshrc:

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglobएक zsh सुविधा है जो शेल को कमांड के तर्क में वाइल्डकार्ड का विस्तार नहीं करने के लिए कहती है। इस तरह आप लिख सकते हैं zmv *.txt \$1.txt(आपको $प्रतिस्थापन पाठ में हमेशा सुरक्षा की आवश्यकता होगी )।

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