Ravindra BagaleCourses & study guides English

Linux मध्ये copy: cp, cp -r, wildcards (* ?) आणि brace ranges

चला, सुरू करूया. Folders आणि files आपण आता चार पद्धतींनी बनवू शकतो: touch, cat, nano आणि vi. Laptop वर files चं पुढचं काम काय असतं? Copy, cut-paste, rename आणि delete. आज copy. Server वर mouse नाही, right-click नाही, म्हणून एकच command हे काम करतो: cp. आपण tree मध्ये खाली copy करणार, वर copy करणार, आणि current folder मध्ये आणणार. अख्खे folders copy करणार, एकदम अनेक files copy करणार, आणि wildcards वापरून, ज्या files ची नावं एका pattern मध्ये बसतात त्या सगळ्या. तुमचा server चालू ठेवा आणि प्रत्येक command माझ्यासोबत type करा.

या class मध्ये काय शिकणार

  • Practice साठी ravi/one/two tree बनवणं
  • cp SOURCE DESTINATION: काय copy करायचं, आणि कुठे ठेवायचं
  • Tree मध्ये खाली copy, वर copy (तीन पद्धती), आणि . ने current folder मध्ये
  • Backup copies, copy करतानाच rename, आणि गुपचूप होणारं overwrite (cp -i)
  • Space असलेली नावं
  • cp -r ने folders copy करणं, आणि त्याशिवाय येणारा खरा error
  • Destination folder आधीच असेल तर काय होतं
  • बाजूच्या (sibling) folder मध्ये copy
  • Folder ला स्वतःच्याच आत copy का करता येत नाही
  • एकदम अनेक files: शेवटचं नाव destination
  • * wildcard: *.txt आणि my*
  • पटकन test files: file{1..50}.txt आणि file{a..z}.txt
  • ? wildcard: ? आणि ??
  • file11 ते file19 चा प्रॉब्लेम, आणि दोन बरोबर उत्तरं
  • Wildcards ना naming pattern का लागतो
  • Practice tasks

1. उजळणी आणि आजचं practice tree

का. Copy करायला आधी काहीतरी हवं ना. अख्खा class आपण एकच छोटं tree वापरणार, म्हणून आधी ते बनवून घ्या.

तुम्हाला आधीच माहीत असायला हवं. Folders आणि files बनवणं: Linux files: touch, cat, nano, vi, brace shortcuts, ls -R आणि tree. Paths वापरून फिरणं: Linux directories आणि paths.

कसं (home folder मधून). या तीन ओळी चालवा:

cd
mkdir -p ravi/one/two
touch my.txt

tree ravi (किंवा ls -R ravi) ने check करा:

ravi
└── one
    └── two

2 directories, 0 files

म्हणजे /home/ec2-user मध्ये folder ravi आणि file my.txt; ravi मध्ये one; one मध्ये two.

Correction

Class मध्ये सांगितलं की mkdir आणि touch एकच नाव घेतात. ते एक किंवा अनेक नावं घेतात: mkdir ravi raja rani ने तीन folders, touch 1.txt 2.txt 3.txt ने तीन files. cp मध्ये नवीन वेगळंच आहे: त्याला नेहमी दोन प्रकारची नावं लागतात, source आणि destination.

2. cp: source आणि destination

का. Laptop वर right-click → Copy, दुसरा folder उघडा, right-click → Paste. Server वर दोन्ही गोष्टी एकाच ओळीत सांगायच्या.

काय. cp = copy. त्याला दोन भाग लागतात:

  1. Source: काय copy करायचं.
  2. Destination: copy कुठे ठेवायची.
  3. क्रम ठरलेला: आधी source, मग destination.

उदाहरण, हे my.txt file ला ravi folder मध्ये copy करतं:

cp my.txt ravi
cp ला दोन गोष्टी लागतात: काय copy करायचं, आणि कुठे ठेवायचं cpmy.txtraviSOURCE = काय copy करायचंDESTINATION = कुठे ठेवायचं cp my.txt raviravi folder आहे: copy आत जाते, ravi/my.txt म्हणून cp my.txt backup.txtbackup.txt folder नाही: नव्या नावाची दुसरी file मिळते cp my.txt you.txt my.mp3 raviअनेक sources: शेवटचं नाव destination (folder) क्रम महत्त्वाचा: आधी काय, मग कुठे. mkdir आणि touch पण अनेक नावं घेतात: mkdir a b c, touch 1.txt 2.txt 3.txt

Figure 1. cp my.txt ravi: my.txt हा source, ravi हा destination. Destination folder असेल तर copy आत जाते; नवं नाव दिलं तर दुसरी file बनते; अनेक sources असतील तर शेवटचं नाव destination folder.

cp destination कसा वाचतो:

  1. आधीच असलेला folder असेल तर copy त्याच नावाने आत जाते: cp my.txt ravi → ravi/my.txt.
  2. आधीच असलेला folder नसेल तर cp त्या नावाची file बनवतो: cp my.txt backup.txt → दुसरी file backup.txt.
  3. Original जिथे होती तिथेच राहते. Copy source मधून कधीच काही काढत नाही.

3. Tree मध्ये खाली copy

का. सगळ्यात जास्त लागणारी copy: तुम्ही जिथे आहात तिथून खालच्या folder मध्ये file.

कसं (तुम्ही /home/ec2-user मध्ये आहात):

  1. pwd → /home/ec2-user
  2. cp my.txt ravi/one/two
  3. Check: ls ravi/one/two → my.txt

Destination ravi/one/two हा खाली जाणारा relative path आहे: ravi मध्ये, मग one, मग two.

4. Tree मध्ये वर copy: तीन पद्धती

का. आता तुम्ही tree मध्ये खोल आत आहात आणि file परत वर पाठवायची आहे. इथे मागच्या class चे paths कामाला येतात.

Task. तुम्ही two मध्ये आहात, आणि my.txt वर /home/ec2-user मध्ये copy करायची आहे.

Handwritten board: cp my.txt ravi with source and destination written under the two names; a prompt ending in tilde with cp my.txt ravi/one/two; three prompts ending in two with cp my.txt ../../.., cp my.txt /home/ec2-user and cp my.txt ~; on the right a tree home, ec2-user, ravi, one, two with my.txt and arrows going up to ec2-user.

Class board वरून: cp my.txt ravi: source आणि destination. मग home, ec2-user, ravi, one, two या tree वर: ec2-user मधून cp my.txt ravi/one/two खाली copy करतो; two मधून cp my.txt ../../.., cp my.txt /home/ec2-user आणि cp my.txt ~ तिघंही वर ec2-user मध्ये copy करतात.

कसं (तिघंही एकच काम करतात):

  1. cd ~/ravi/one/two
  2. पद्धत 1, relative: cp my.txt ../../.. (वर one, वर ravi, वर ec2-user)
  3. पद्धत 2, absolute: cp my.txt /home/ec2-user
  4. पद्धत 3, tilde: cp my.txt ~
  5. Check: ls -l ~/my.txt → time वरून कळतं की आत्ताच लिहिली गेली.

ec2-user मध्ये आधीच एक my.txt होती, म्हणून प्रत्येक वेळी ती बदलली गेली (इथे दोन्ही तीच रिकामी file आहे). याबद्दल section 6 मध्ये.

Dots नीट मोजा. .. म्हणजे एक level वर. two मधून एक .. म्हणजे one, दोन म्हणजे ravi, तीन म्हणजे ec2-user.

खाली copy, वर copy, इथे आण / home ec2-user ravi one two my.txtmy.txt● तुम्ही ec2-user मध्ये आहात my.txtmy.txt● तुम्ही two मध्ये आहात my.txtmy.txt● तुम्ही ec2-user मध्ये आहात 1. खाली: ec2-user मधून two मध्ये$ cp my.txt ravi/one/twodestination हा खाली जाणारा path आहे 2. वर: two मधून परत ec2-user मध्ये$ cp my.txt ../../..$ cp my.txt /home/ec2-user$ cp my.txt ~एकाच destination चे तीन लिहायचे प्रकार 3. इथे आण: . = हाच folder$ cp ravi/one/two/my.txt .source लांब आहे, destination आहे . हिरवा dashed box = नवी copy प्रत्येक copy ls (किंवा tree) ने check करा.

Figure 2. Animation: ec2-user मधून cp my.txt ravi/one/two खाली copy करतो; two मधून cp my.txt ../../.., /home/ec2-user किंवा ~ वर copy करतो; मग cp ravi/one/two/my.txt . file current folder मध्ये आणतो. हिरवा dashed box म्हणजे नवी copy.

Ravindra Bagale's Tip

Copy झाली की नाही शंका आहे? बघा. प्रत्येक cp नंतर destination चं ls करा. जी copy तुम्ही check केली नाही, ती फक्त झाली असेल अशी आशा आहे.

5. इथे आण: . म्हणजे हाच folder

का. कधी कधी file लांब असते आणि ती तुम्ही उभे आहात तिथे हवी असते.

काय. एक dot . म्हणजे current directory. तो पण बाकीच्यांसारखाच एक destination आहे.

कसं (तुम्ही /home/ec2-user मध्ये आहात):

  1. cp ravi/one/two/my.txt .
  2. Source खाली जाणारा path आहे; destination आहे . (इथे).

Classroom line

To say "current directory", we write a dot.

my.txt इथे आधीच असेल तर हे काही न विचारता ती बदलतं (पुढचा section बघा). इथे ती तीच रिकामी file आहे, म्हणून काही जात नाही.

Dots वेगळे लक्षात ठेवा: . = इथे, .. = एक level वर, ~ = home.

6. Backup copies, copy करतानाच rename, आणि गुपचूप overwrite

का. महत्त्वाची file edit करायच्या आधी एक copy ठेवा. Edit बिघडलं तरी जुनी version तुमच्याकडे राहते.

त्याच folder मध्ये backup. Copy ला नवं नाव द्या:

  1. cp 1.txt 2.txt
  2. 2.txt नव्हती, म्हणून ती 1.txt ची copy म्हणून बनते.

Copy करतानाच rename. या चारही ओळी my.txt ला ravi मध्ये copy करतात:

  1. cp my.txt ravi → ravi/my.txt
  2. cp my.txt ravi/ → तेच. Tab completion slash आपोआप लावतो; कसंही चालतं.
  3. cp my.txt ravi/my.txt → तेच, नाव लिहून.
  4. cp my.txt ravi/my-backup.txt → ravi मध्ये copy ला नवं नाव मिळतं.
एकाच folder मध्ये copy: backup, overwrite, same file Backup copy$ cp 1.txt 2.txt1.txt2.txt2.txt आधी नव्हती:आता ती 1.txt ची copy आहेनवं नाव = copy करतानाच rename 2.txt आधीच आहे$ cp 1.txt 2.txtकाही विचारत नाही, message नाही:जुनी 2.txt बदलली जाते$ cp -i 1.txt 2.txtcp: overwrite '2.txt'?-i आधी विचारतो: y = बदल,n = जुनी file ठेव तेच नाव, तीच जागा$ cp my.txt my.txtcp: 'my.txt' and'my.txt' are the same filecopy ला वेगळं नावकिंवा वेगळा folder लागतो सांभाळून: destination folder नसेल तर cp त्या नावाची FILE बनवतो. cp my.txt rav (typo) = rav नावाची file.

Figure 3. cp 1.txt 2.txt ने backup copy बनते. 2.txt आधीच असेल तर cp ती न विचारता बदलतो, cp -i आधी विचारतो. cp my.txt my.txt fail होतं कारण source आणि destination एकच file आहे.

सांभाळून: cp न विचारता overwrite करतो. 2.txt आधीच असेल तर cp 1.txt 2.txt ती बदलून टाकतो. ना प्रश्न, ना message; 2.txt मधलं जुनं content गेलं.

सुरक्षित पद्धत: cp -i (interactive) आधी विचारतो:

cp -i 1.txt 2.txt
cp: overwrite '2.txt'?

बदलायचं असेल तर y, जुनी file ठेवायची असेल तर n type करा.

तेच नाव, तीच जागा. ही copy नाहीच:

cp my.txt my.txt
cp: 'my.txt' and 'my.txt' are the same file

Typo चा सापळा. Destination folder नसेल तर cp तक्रार करत नाही. तो त्या नावाची file बनवतो. cp my.txt rav (तुम्हाला ravi म्हणायचं होतं) गुपचूप rav नावाची file बनवतो.

Correction

Class मधल्या दोन गोष्टी. एक, cp 1.txt 2.txt असं सांगितलं जणू दुसरी copy नेहमी safe असते. 2.txt आधीच असेल तर cp ती गुपचूप overwrite करतो. Destination आधीच असू शकत असेल तर cp -i वापरा. दोन, board वरच्या backup उदाहरणात नवं नाव म्हणून तारीख वापरली होती. ravi/my-backup.txt सारखं साधं नाव तीच कल्पना तितक्याच चांगल्या पद्धतीने दाखवतं.

Ravindra Bagale's Tip

तारीख type न करता dated backup हवा? cp my.txt my-$(date +%F).txt ने my-YYYY-MM-DD.txt सारखी आजच्या तारखेची file बनते. cp चालायच्या आधी $(date +%F) च्या जागी तारीख येते.

7. Space असलेली नावं

का. Command line वर space शब्द वेगळे करतो. cp my.txt my folder म्हणजे तीन नावं: my.txt, my आणि folder.

कसं. Space असलेलं नाव single quotes मध्ये टाका:

  1. mkdir 'my folder'
  2. cp my.txt 'my folder'
  3. Check: ls 'my folder' → my.txt

Classroom line

If there's a space, put it in single quotes.

त्याहून चांगलं: नावात space वापरूच नका. my-folder किंवा my_folder वापरा.

8. Folders copy करणं: cp -r

का. File म्हणजे एकच वस्तू. Folder म्हणजे आत अजून boxes असलेला box: ravi मध्ये one, one मध्ये two, two मध्ये files असू शकतात. Folder copy करायला cp ला प्रत्येक level वरच्या प्रत्येक box च्या आत जावं लागतं.

काय. -r = recursive: परत परत, आतल्या प्रत्येक folder मध्ये जाऊन, सगळं copy. -R (capital) अगदी तेच करतो.

आधी -r शिवाय करून बघा:

cp ravi ravi1
cp: -r not specified; omitting directory 'ravi'

cp नकार देतो, आणि का ते सांगतो. काहीच copy होत नाही.

आता -r सोबत:

  1. cp -r ravi ravi1
  2. Check: tree ravi1 → आत तेच one/two, files सकट.
File म्हणजे एकच वस्तू. Folder म्हणजे आत boxes असलेला box. File: साधा cp$ cp my.txt ravimy.txtravi/my.txtएकच वस्तू, आत काही नाही Folder: cp -r (recursive = प्रत्येक box च्या आत जा)$ cp -r ravi ravi1ravi/one/two/my.txtravi1/one/two/my.txt $ cp ravi ravi1cp: -r not specified; omitting directory 'ravi' -R अगदी -r सारखाच. एका file वर cp -r पण चालतो, पण त्याने काही फरक पडत नाही: तो folders साठी वापरा.

Figure 4. डावीकडे: cp my.txt ravi एक file copy करतो. उजवीकडे: cp -r ravi ravi1 हा ravi folder आतल्या सगळ्या सकट copy करतो. -r शिवाय cp म्हणतो -r not specified; omitting directory 'ravi'.

अजून उदाहरणं:

  1. mkdir -p one/two/three, मग cp -r ravi one/two/three → ravi ची copy, आतल्या सगळ्या सकट, three मध्ये.
  2. cp -r ravi ~/ravi-backup → अख्ख्या folder चा backup.

Classroom line

But there's also a trick...

जुगाड असा: cp -r my.txt ravi एका file वर पण चालतो. पण त्याने काही मिळत नाही. File मध्ये आत जायला काहीच नसतं. सवय साफ ठेवा: files साठी साधा cp, folders साठी cp -r.

Classroom line

Go on, try it yourself.

Correction

Board वर "-r शिवाय चालणार नाही" एवढंच सांगितलं. खरं काय दिसतं ते हे: cp: -r not specified; omitting directory 'ravi'. cp folder सोडून देतो, पण त्याच command मध्ये दिलेल्या files मात्र copy करतो.

9. Destination folder आधीच असेल तेव्हा

का. cp -r ravi ravi1 दुसऱ्यांदा चालवला की वेगळं वागतो. हे माहीत नसेल तर folders मध्ये folders होऊन बसतात.

हे कसं वागतं:

  1. पहिल्यांदा, ravi1 नाहीये: cp -r ravi ravi1 ने ravi1 ही ravi ची पूर्ण copy बनते.
  2. दुसऱ्यांदा, ravi1 आता आहे: cp -r ravi ravi1 नवी copy त्याच्या आत टाकतो, ravi1/ravi म्हणून.
  3. Check: ls ravi1 → one ravi

Files सारखाच नियम: destination आधीच असलेला folder असेल तर copy आत जाते.

cp -r ravi ravi1 दोनदा चालवा आणि ravi1 बघा पहिल्यांदा: ravi1 नाहीये$ cp -r ravi ravi1ravi1onetwomy.txtravi1 ही ravi ची पूर्ण copy दुसऱ्यांदा: ravi1 आधीच आहे$ cp -r ravi ravi1ravi1ravionetwomy.txtजुनी copy तशीच राहते,नवी copy आत जाते:ravi1/raviravi1 मध्ये आता:one(जुनी copy)ravi(नवी copy) Files सारखाच नियम: destination आधीच असलेला folder असेल तर copy आत जाते. ls ravi1 ने check करा.

Figure 5. पहिल्या cp -r ravi ravi1 ने ravi1 ही ravi ची copy बनते. दुसऱ्यांदा, ravi1 आधीच असताना, नवी copy आत जाते: ravi1/ravi.

Correction

Class मध्ये फक्त पहिल्यांदाचं दाखवलं. ravi1 आधीच असेल तर cp -r ravi ravi1 copy ला ravi1/ravi म्हणून आत ठेवतो. आधी आणि नंतर ls ravi1 ने check करा.

10. बाजूला copy: sibling folder मध्ये

का. एकमेकांच्या बाजूला असलेले folders (siblings) नेहमी दिसतात: dev आणि prod, old आणि new.

Setup. /home/ec2-user मध्ये दोन folders, ram आणि sham. तुम्ही ram मध्ये आहात, आणि ram मध्ये m.txt file आहे.

cd
mkdir ram sham
touch ram/m.txt
cd ram

कसं (दोन पद्धती):

  1. cp m.txt ../sham → .. वर ec2-user मध्ये, मग sham मध्ये.
  2. cp m.txt ~/sham → home मधून थेट sham मध्ये.
  3. Check: ls ~/sham → m.txt

11. Folder ला स्वतःच्याच आत copy करता येत नाही

का. हे साधी copy वाटते, पण होऊच शकत नाही. का ते समजलं की cp folders मधून कसा फिरतो ते कळतं.

Setup. one मध्ये two आहे (mkdir -p one/two). आता one ला two मध्ये copy करायचं.

-r शिवाय, नेहमीचा message:

cp one one/two
cp: -r not specified; omitting directory 'one'

-r सोबत, विचार करा:

  1. cp one ला two मध्ये copy करतो.
  2. पण two तर one च्या आत आहे, म्हणजे one च्या copy मध्ये two पण यायला हवा...
  3. ...आणि त्यात परत one ची copy, त्यात परत two, असं चालूच.
  4. हे कधीच संपणार नाही: एक endless loop.

Linux ते लगेच थांबवतो आणि काहीच copy करत नाही:

cp -r one one/two
cp: cannot copy a directory, 'one', into itself, 'one/two/one'
Folder ला त्याच्याच आतल्या folder मध्ये copy करणं: endless loop, जो Linux थांबवतो $ cp -r one one/two onetwo one ला copy कर ...... two मध्ये, जो one च्याच आत आहे one/two/one one/two/one/two/one one/two/one/two/one/two/one ... copy परत परत स्वतःलाच आत घेईल: cp: cannot copy a directory, 'one', into itself, 'one/two/one'cp नकार देतो, काहीच copy होत नाही. -r शिवाय फक्त omitting directory चा message येतो. $ cp -r one ~/backupचालतं: destination source च्या बाहेर आहे नियम: destination हा source च्या आत नसावा.

Figure 6. cp -r one one/two म्हणजे one ला त्याच्याच आतल्या two मध्ये टाकणं, म्हणजे copy परत परत स्वतःलाच आत घेईल. cp ते cannot copy a directory into itself म्हणून थांबवतो. one बाहेरच्या folder मध्ये, जसं ~/backup, copy केला तर चालतं.

नियम: destination हा source च्या आत नसावा. cp -r one ~/backup चालतं.

Correction

Class मध्ये याला "deadlock" म्हटलं, "कुठेच थांबणार नाही" असं. Deadlock हा चुकीचा शब्द आहे (त्याचा अर्थ दोन गोष्टी एकमेकांची वाट बघत अडकणं). विचार मात्र बरोबर आहे: हा endless loop झाला असता, जो Linux थांबवतो. GNU cp सुरू व्हायच्या आधीच हे ओळखतो आणि cannot copy a directory, 'one', into itself, 'one/two/one' म्हणून लगेच थांबतो.

12. एकदम अनेक files copy करणं

का. दहा files साठी दहा commands म्हणजे वेळ वाया. एक cp अनेक sources घेऊ शकतो.

काय.

  1. हवे तितके sources देता येतात.
  2. शेवटचं नाव नेहमी destination असतं.
  3. एकापेक्षा जास्त sources असतील तर destination आधीच असलेला folder हवा.

कसं (तुम्ही /home/ec2-user मध्ये आहात). Files बनवा, मग तिन्ही एकाच वेळी copy करा:

touch you.txt my.mp3
cp my.txt you.txt my.mp3 ravi

Check: ls ravi → my.mp3, my.txt आणि you.txt आता तिथे आहेत, one आणि आधी copy केलेल्या गोष्टींच्या शेजारी.

Handwritten board: a prompt ending in tilde with ls, the names my.txt, you.txt, ravi and my.mp3 underneath; below it cp my.txt you.txt my.mp3 ravi with my.mp3 and ravi underlined and the word destination written under ravi.

Class board वरून: ls मध्ये my.txt, you.txt, ravi आणि my.mp3 दिसतात. cp my.txt you.txt my.mp3 ravi तिन्ही files copy करतो, आणि शेवटचं नाव, ravi, destination म्हणून दाखवलंय.

शेवटचं नाव folder नसेल तर cp थांबतो:

cp my.txt you.txt my.mp3
cp: target 'my.mp3' is not a directory

नवीन coreutils versions मध्ये हे cp: target 'my.mp3': Not a directory असं येतं; अर्थ तोच.

Classroom line

You only got the feeling it worked; in reality it didn't happen.

म्हणूनच नेहमी ls ने check करायचं.

13. * wildcard

का. प्रत्येक file चं नाव type करणं जमत नाही. सहसा नावांमध्ये काहीतरी common असतं: सगळी .txt ने संपतात, सगळी my ने सुरू होतात. Wildcards ने नावांची list देण्याऐवजी pattern सांगता येतो.

काय. * म्हणजे कुठलेही characters, कितीही, अगदी शून्य पण.

कसं:

  1. cp *.txt ravi → .txt ने संपणारं प्रत्येक नाव.
  2. cp my* ravi → my ने सुरू होणारं प्रत्येक नाव (my.txt, my.mp3, my.mp4...).
Handwritten board: a prompt ending in tilde with ls; underneath my.txt, you.txt, ravi, my.mp3, 1.txt, 2.txt, dots, 50.txt, then my.logs and my.mp4; below that cp *.txt ravi and cp my* ravi.

Class board वरून: ls मध्ये my.txt, you.txt, ravi, my.mp3, 1.txt, 2.txt ते 50.txt, my.logs आणि my.mp4. मग cp *.txt ravi हे .txt ने संपणारं प्रत्येक नाव copy करतो, आणि cp my* ravi हे my ने सुरू होणारं प्रत्येक नाव.

Wildcards pattern मध्ये बसणारी नावं उचलतात Folder मधल्या files: $ cp *.txt ravi→ cp my.txt you.txt 1.txt 2.txt file1.txt filea.txt file11.txt fileaa.txt ravi* = कुठलेही characters, कितीही (शून्य पण) $ cp my* ravi→ cp my.txt my.mp3 my.mp4 ravimy ने सुरू, पुढे काहीही $ cp file?.txt ravi→ cp file1.txt filea.txt ravi? = बरोबर एक character $ cp file??.txt ravi→ cp file11.txt fileaa.txt ravi?? = बरोबर दोन characters $ cp Ram* ravi→ cp Ram Ramayan raviRam स्वतः पण match होतं: * रिकामा असू शकतो my.txt you.txt my.mp3 my.mp4 1.txt 2.txt file1.txt filea.txt file11.txt fileaa.txt Ram Ramayan हिरवं = match. cp सुरू व्हायच्या आधीच shell pattern च्या जागी जुळणारी नावं ठेवतो.

Figure 7. बारा नावांवर animation: *.txt हे .txt ने संपणारं प्रत्येक नाव उचलतं, my* हे my ने सुरू होणारी नावं, file?.txt हे file1.txt आणि filea.txt, file??.txt हे file11.txt आणि fileaa.txt, आणि Ram* हे Ram आणि Ramayan.

Matching कोण करतं? Shell, cp नाही. cp सुरू व्हायच्या आधी bash *.txt च्या जागी जुळणारी नावं ठेवतो. echo ने आधी बघा, तो काहीच बनवत नाही, copy करत नाही:

  1. echo *.txt → उदाहरणार्थ 1.txt 2.txt my.txt you.txt
  2. echo my* → उदाहरणार्थ my.mp3 my.txt

काहीच match झालं नाही तर bash pattern तसाच पुढे देतो, आणि cp *.pdf नावाची file शोधतो:

cp *.pdf ravi
cp: cannot stat '*.pdf': No such file or directory

एखादा folder match झाला तर, उदाहरणार्थ my.logs नावाचा folder, साधा cp my* ravi files copy करतो आणि folder cp: -r not specified; omitting directory 'my.logs' म्हणून सोडून देतो.

.txt सारखी extensions माणसांसाठी आणि programs साठी असतात; Linux साठी ती नावाचाच भाग. म्हणूनच *.txt चालतं: ते फक्त अक्षरं जुळवतं, बाकी काही नाही.

14. पटकन test files: brace ranges

का. Wildcards practice करायला भरपूर files लागतात. पन्नास touch commands कोण type करणार?

काय. दोन dots असलेले braces range बनवतात:

  1. touch file{1..50}.txt → file1.txt ते file50.txt (50 files)
  2. touch file{a..z}.txt → filea.txt ते filez.txt (26 files)
  3. touch file{10..20}.txt → file10.txt ते file20.txt (11 files; कुठलीही सुरुवात आणि शेवट चालतो)
  4. touch file{01..12}.txt → file01.txt ते file12.txt (पुढचा zero प्रत्येक number ला pad करतो)

आधी echo ने बघा: echo file{1..5}.txt → file1.txt file2.txt file3.txt file4.txt file5.txt

हा files chapter मधलाच {Ram,Laxman} brace shortcut आहे, फक्त list ऐवजी range.

15. ? wildcard: बरोबर एक character

का. * हावरट आहे: कितीही लांबीचं काहीही जुळवतो. कधी कधी "इथे बरोबर एकच character" हवं असतं.

काय. ? म्हणजे बरोबर एक character. ?? म्हणजे बरोबर दोन.

कसं. चार files घ्या, file1.txt, filea.txt, file11.txt आणि fileaa.txt:

  1. cp file?.txt ravi → file1.txt आणि filea.txt (file नंतर एक character)
  2. cp file??.txt ravi → file11.txt आणि fileaa.txt (दोन characters)
Handwritten board: file1.txt, filea.txt, file11.txt and file aa.txt across the top; cp file?.txt ravi and cp file??.txt ravi on the left, each question mark drawn like a curly hook; on the right touch file{a..z}.txt with filea.txt and fileb.txt written above it.

Class board वरून: चार files: file1.txt, filea.txt, file11.txt आणि fileaa.txt. cp file?.txt ravi हे file नंतर एक character असलेल्या copy करतो, cp file??.txt ravi दोन असलेल्या. उजवीकडे touch file{a..z}.txt ने filea.txt, fileb.txt वगैरे बनतात.

मोजून बघा. file{1..50}.txt, file{a..z}.txt आणि fileaa.txt असलेल्या folder मध्ये:

  1. file?.txt → 35 नावं (file1 ते file9, आणि filea ते filez)
  2. file??.txt → 42 नावं (file10 ते file50, आणि fileaa)

16. file11 ते file19 चा प्रॉब्लेम

Task. Folder मध्ये file1.txt ते file50.txt आहेत. फक्त file11.txt ते file19.txt ravi मध्ये copy करा.

मोह पाडणारं उत्तर चुकीचं आहे: cp file1* ravi. * रिकामा असू शकतो, म्हणून file1* हे जुळवतं:

  1. स्वतः file1.txt (1 नंतर काहीच नाही)
  2. file10.txt (अजून एक digit, पण तो 10 आहे, 11 ते 19 नाही)
  3. file11.txt ते file19.txt
  4. आणि file100.txt, असेल तर

शब्दांमध्ये पण हाच सापळा: Ram* हे Ram, Rama आणि Ramayan जुळवतं.

बरोबर उत्तर 1: brace range. आधीच असलेल्या files साठी पण चालतं, कारण cp सुरू व्हायच्या आधी shell नावं लिहून काढतो:

cp file{11..19}.txt ravi

बरोबर उत्तर 2: brackets. [1-9] म्हणजे 1 ते 9 मधलं एक character:

cp file1[1-9].txt ravi
Task: फक्त file11.txt ते file19.txt ravi मध्ये copy करा $ cp file1* raviचूक: file1.txt आणि file10.txt पण घेतो 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ cp file{11..19}.txt raviबरोबर: braces नऊ नावं लिहून देतात 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $ cp file1[1-9].txt raviबरोबर: [1-9] = 1 ते 9 मधलं एक character 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Boxes = file1.txt ... file20.txt. नावांमध्ये पण हाच सापळा: Ram* हे Ram, Rama आणि Ramayan उचलतं.File नसली तरी braces नाव बनवतात (cp: cannot stat ... No such file); wildcards फक्त असलेलीच नावं उचलतात.

Figure 8. file1 ते file20 असे वीस boxes. cp file1* ravi चुकून file1 आणि file10 पण घेतो. cp file{11..19}.txt ravi आणि cp file1[1-9].txt ravi बरोबर file11 ते file19 घेतात.

दोघांमधला फरक:

  1. Braces नावं बनवतात, files असोत किंवा नसोत. एखादी नसेल तर cp तिच्यासाठी cp: cannot stat 'file19.txt': No such file or directory दाखवतो आणि बाकीच्या copy करतो.
  2. Wildcards आणि brackets फक्त असलेलीच नावं उचलतात. नसलेली file उचललीच जात नाही.

Correction

Class मध्ये braces "फक्त files बनवण्यासाठी" असं धरलं, आणि file11 ते file19 ची copy सुटली नाही; board वर file1* पण दाखवलं, जे चुकीचं आहे. दोन्ही बरोबर उत्तरं वर आहेत: cp file{11..19}.txt ravi आणि cp file1[1-9].txt ravi. लक्षात ठेवा, file1* स्वतः file1.txt पण जुळवतो, कारण * शून्य characters पण जुळवू शकतो.

17. Wildcards ना naming pattern लागतो

का. Wildcard फक्त नावांमधलं common तेवढंच सांगू शकतो. नावांमध्ये काहीच common नसेल तर लिहायला pattern च नाही.

Classroom line

Wildcards work only where the names follow a pattern.

प्रत्यक्षात:

  1. report-jan.txt, report-feb.txt, report-mar.txt → report-*.txt सगळ्या उचलतो.
  2. a.txt, notes, final_v2.doc → कामाचा pattern नाही; एक एक नाव द्या.
  3. log01 ते log30 (zero-padded) → log0? 01 ते 09 उचलतो, log1? 10 ते 19. Zero नसेल तर log1* ला log1 पण सापडतो.

Ravindra Bagale's Tip

पुढे लागणाऱ्या wildcard चा विचार करून नावं द्या: तोच prefix, तेच extension, numbers ला पुढे zero. खऱ्या server वर यामुळेच "मागच्या महिन्याचे सगळे logs" एका ओळीत copy किंवा साफ करता येतात. Copy, move आणि remove च्या अजून commands: 3.3 Working with files and directories.

18. Practice

Try at home

Task 1: वर, खाली, इथे

  1. ~ मध्ये ravi/one/two आणि my.txt बनवा (section 1).
  2. ~ मधून my.txt ला two मध्ये copy करा.
  3. two मध्ये cd करा आणि तीन पद्धतींनी परत वर copy करा: ../../.., /home/ec2-user, ~.
  4. Home ला जा आणि . वापरून ravi/one/two/my.txt इथे आणा.

Task 2: backups

  1. echo old > 2.txt, echo new > 1.txt, मग cp 1.txt 2.txt. 2.txt वाचा. old चं काय झालं?
  2. cp -i ने परत करा आणि n उत्तर द्या.
  3. एका command मध्ये my.txt पासून ravi/my-backup.txt बनवा.

Task 3: folders

  1. cp ravi ravi1. Error वाचा.
  2. cp -r ravi ravi1, मग परत चालवा. ls ravi1 काय दाखवतो ते समजावून सांगा.
  3. cp -r one one/two करून बघा आणि message वाचा.

Task 4: wildcards

  1. नवीन folder w मध्ये: touch file{1..50}.txt file{a..z}.txt fileaa.txt
  2. आधी अंदाज करा, मग echo ने check करा: file?.txt, file??.txt, file1*, file*a.txt.
  3. फक्त file11.txt ते file19.txt folder r मध्ये copy करा, दोन्ही पद्धतींनी.
  4. या folder मध्ये cp file?.txt r फक्त file1.txt ते file9.txt नाही, जास्त copy करतो. का? फक्त त्या नऊ brackets वापरून copy करा.

Error आला तर हळू वाचा: cp जवळजवळ नेहमी नक्की काय चुकलं ते सांगतो. झालं की console मधून instance stop करा.

Classroom line

If you get an error, ask me.

Recap

थोडक्यात

  1. cp SOURCE DESTINATION: आधी काय, मग कुठे. Source कधीच काढला जात नाही.
  2. Destination folder असेल → copy आत जाते. दुसरं कुठलंही नाव → त्या नावाची file.
  3. खाली: cp my.txt ravi/one/two. two मधून वर: ../../.., /home/ec2-user किंवा ~. इथे: .
  4. cp 1.txt 2.txt ने backup बनतो, आणि 2.txt असेल तर ती गुपचूप overwrite होते. cp -i आधी विचारतो.
  5. cp my.txt my.txt → are the same file. Folder च्या नावात typo झाला तर folder ऐवजी file बनते.
  6. Space असलेली नावं quotes मध्ये: 'my folder'. त्याहून चांगलं, space टाळा.
  7. Folders ना cp -r (किंवा -R) लागतो. नाहीतर: -r not specified; omitting directory.
  8. ravi1 असताना परत cp -r ravi ravi1 → ravi1/ravi.
  9. Folder स्वतःच्या आतल्या folder मध्ये जाऊ शकत नाही: cannot copy a directory ... into itself. Endless loop, जो Linux थांबवतो.
  10. अनेक sources: शेवटचं नाव destination, आणि तो folder हवा.
  11. * = कुठलेही characters (शून्य पण); ? = बरोबर एक. Shell ते expand करतो; echo ने आधी बघा.
  12. touch file{1..50}.txt, file{a..z}.txt: brace ranges ने पटकन नावं.
  13. फक्त file11 ते file19: cp file{11..19}.txt ravi किंवा cp file1[1-9].txt ravi. file1* नाही.
  14. Wildcards ना naming pattern लागतो: नावं विचार करून द्या.

Samjla ka? Ghari sagle tasks karun bagha ani pratyek cp nantar ls ne check kara.


Ravindra Bagale, trainer: linkedin.com/in/ravindra-bagale. Folders आणि files ची नावं (ravi, one, two, ram, sham, my.txt, file1.txt वगैरे) शिकण्यासाठीची उदाहरणं आहेत. Commands चे outputs आणि error messages GNU bash आणि coreutils वर तपासले, जे Amazon Linux 2023 पण वापरतं.