Огляд

Викладання: хв
Вправи: хв
Питання
Цілі

Створення каталогів

Тепер ми знаємо, як досліджувати файли та каталоги, але як їх створювати?

На цьому уроці ми дізнаємося про створення та переміщення файлів і каталогів на прикладі каталогу exercise-data/writing.

Крок перший: подивіться, де ми знаходимося і що вже маємо

Ми все ще маємо бути у каталозі shell-lesson-data на Робочому столі (англ. Desktop), що ми можемо перевірити за допомогою:

$ pwd
/Users/nelle/Desktop/shell-lesson-data

Далі ми перейдемо до каталогу exercise-data/writing і подивимося, що у ньому міститься:

$ cd exercise-data/writing/
$ ls -F
haiku.txt  LittleWomen.txt

Створення каталогу

Створимо новий каталог з назвою thesis за допомогою команди mkdir thesis (яка не має виводу):

$ mkdir thesis

Як ви можете здогадатися з її назви, команда mkdir означає ‘зробити каталог’ (англ. ‘make directory’). Оскільки thesis є відносним шляхом (тобто не має початкової косої риски, як /what/ever/thesis), новий каталог буде створено у поточному робочому каталозі:

$ ls -F
haiku.txt  LittleWomen.txt  thesis/

Оскільки ми щойно створили каталог thesis, у ньому ще нічого немає:

$ ls -F thesis

Зауважте, що команда mkdir не обмежується створенням окремих каталогів по одному. Параметр -p дозволяє команді mkdir створювати каталог із вкладеними підкаталогами за одну операцію:

$ mkdir -p ../project/data ../project/results

Параметр -R до команди ls покаже усі вкладені підкаталоги у каталозі. Давайте скористаємося ls -FR для рекурсивного відображення нової ієрархії каталогів, яку ми щойно створили у каталозі project:

$ ls -FR ../project
../project/:
data/  results/

../project/data:

../project/results:

Два способи зробити одне й те саме

Використання терміналу для створення каталогу нічим не відрізняється від використання файлового провідника. Якщо ви відкриваєте поточний каталог за допомогою графічного провідника файлів вашої операційної системи, там також з’явиться каталог thesis. Хоча термінал і файловий провідник - це два різні способи взаємодії з файлами, файли та каталоги одні й ті ж самі.

Хороші імена для файлів і каталогів

Складні назви файлів і каталогів можуть зробити ваше життя болісним під час роботи з командним рядком. Тут ми надаємо кілька корисних підказок щодо назв ваших файлів і каталогів.

  1. Не використовуйте пробіли.

Пробіли можуть зробити назву більш змістовною, але оскільки пробіли використовуються для відокремлення аргументів у командному рядку краще уникати їх у назвах файлів і каталогів. Ви можете використовувати - або _ (наприклад, north-pacific-gyre/ замість north pacific gyre/). Щоб перевірити це, спробуйте набрати mkdir north pacific gyre і подивіться, який каталог (або каталоги!) буде створено при перевірці за допомогою ls -F.

  1. Не починайте назву з - (тире).

Команди розглядають назви, що починаються з -, як опції.

  1. Використовуйте літери, цифри, . (крапка), - (тире) і _ (підкреслення).

Багато інших символів мають особливе значення у командному рядку. Про деякі з них ми дізнаємося в цьому уроці. Існують спеціальні символи, які можуть призвести до того, що ваша команда працюватиме не так, як очікувалося і навіть призвести до втрати даних.

Якщо вам потрібно звернутися до назв файлів або каталогів, які містять пробіли або інші спеціальні символи, вам слід взяти назву у лапки ("").

Створення текстового файлу

Давайте змінимо наш робочий каталог на thesis за допомогою cd, а потім запустимо текстовий редактор Nano і створимо файл з назвою draft.txt:

$ cd thesis
$ nano draft.txt

Який редактор?

Коли ми говоримо, що “nano” - це текстовий редактор, ми дійсно маємо на увазі “текст”: він може працювати лише з простими символьними даними, а не з таблицями, зображеннями чи будь-якими іншими зручними для людини даними. Ми використовуємо його у прикладах, тому що це один з найменш складних текстових редакторів. Однак, через цю особливість він може бути недостатньо потужним або гнучким для роботи, яку вам потрібно буде виконати після завершення наших уроків. У системах Unix (таких як Linux та macOS), багато програмістів використовують [Emacs] (http://www.gnu.org/software/emacs/) або Vim (обидва вимагають більше часу на вивчення), або графічний редактор, такий як Gedit. У Windows, можливо, ви захочете скористатися [Notepad++] (http://notepad-plus-plus.org/). У Windows також є вбудований редактор з назвою notepad, який можна запустити з командного рядка таким самим чином, як і nano для цілей цього уроку.

Незалежно від того, яким редактором ви користуєтеся, вам потрібно знати, де він шукає і зберігає файли. Якщо ви запускаєте його з командного рядка, він (ймовірно) використовуватиме ваш поточний робочий каталог як місце за замовчуванням. Якщо ви використовуєте меню “Пуск” вашого комп’ютера, можливо, програма захоче зберегти файли на робочому столі або в каталозі документів (Documents) замість цього. Ви можете змінити це, перейшовши до іншого каталогу під час першого виконання команди “Зберегти як…”.

Давайте наберемо кілька рядків тексту. Після того, як ми будемо задоволені нашим текстом, ми можемо натиснути Ctrl+O (натисніть клавішу Ctrl або Control і, утримуючи її, натиснути клавішу O), щоб записати наші дані на диск (нас запитають, до якого файлу ми хочемо зберегти дані: натисніть клавішу Return, щоб прийняти запропоновану за замовчуванням назву draft.txt).

screenshot of nano text editor in action

Після збереження файлу ми можемо скористатися комбінацією клавіш Ctrl+X, щоб вийти з редактора і повернутися до терміналу.

Клавіша Control, Ctrl або ^

Клавіша Control також називається клавішею Ctrl. Існує декілька способів, в які можна описати використання клавіші Control. Наприклад, ви можете побачити вказівку натиснути клавішу Control і, утримуючи її натиснутою, натиснути клавішу X, описану будь-яким з наступних способом:

  • “Control-X
  • Control+X
  • “Ctrl-X
  • Ctrl+X
  • ^X
  • C-x

У nano, у нижній частині екрана ви побачите ^G Отримати довідку ^O Вивести на екран. Це означає, що ви можете скористатися Control-G для отримання довідки і Control-O для збереження вашого файлу.

Після завершення роботи команда nano не залишає жодних даних на екрані, але ls тепер показує, що ми створили файл з назвою draft.txt:

$ ls
draft.txt

Створення файлів іншим способом

Ми побачили, як створювати текстові файли за допомогою редактора nano. Тепер спробуйте виконати наступну команду:

$ touch my_file.txt
  1. Що зробила команда touch? Коли ви дивитеся на ваш поточний каталог за допомогою провідника файлів у графічному інтерфейсі, чи відображається файл?

  2. Використовуйте ls -l для перегляду файлів. Який розмір має файл my_file.txt?

  3. Коли вам може знадобитися створити файл у такий спосіб?

Розв’язання

  1. Команда touch створює новий файл з назвою my_file.txt у вашому поточному каталозі. Ви можете переглянути цей новостворений файл, набравши ls у командному рядку. Файл my_file.txt також можна переглянути у вашому графічному провіднику файлів.

  2. Коли ви перевіряєте файл за допомогою ls -l, зверніть увагу, що розмір my_file.txt дорівнює 0 байт. Іншими словами, він не містить жодних даних. Якщо ви відкриєте my_file.txt за допомогою текстового редактора, він буде порожнім.

  3. Деякі програми самі не створюють вихідні файли, а натомість вимагають, щоб порожні файли вже було створено. Під час запуску програма шукає існуючий файл, щоб заповнити його своїми даними. За допомогою команди touch можна ефективно створити порожній текстовий файл для подальшого використання такими програмами.

Щоб уникнути плутанини в подальшому, радимо видалити файл, який ви щойно створили, перед тим, як переходити до решти епізоду, інакше майбутні результати можуть відрізнятися від наведених в уроці. Для цього скористайтеся наступною командою:

$ rm my_file.txt

Що ховається в імені?

Ви, мабуть, помітили, що всі файли Неллі називаються ‘щось крапка щось”, і у цій частині уроку ми завжди використовували розширення .txt. Це лише умовність: ми можемо назвати файл mythesis або майже як завгодно. Однак, більшість людей використовують назви, що складаються з двох частин здебільшого для того, щоб допомогти їм (і їхнім програмам) розрізняти різні типи файлів. Друга частина такого імені називається розширенням файлу і вказує тип даних у файлі: .txt вказує на звичайний текстовий файл, .pdf вказує на PDF-документ, .cfg - це конфігураційний файл з параметрами для тієї чи іншої програми, .png - зображення у форматі PNG, і так далі.

Це лише умовність, хоча й важлива. Файли містять байти: ми та наші програми повинні інтерпретувати ці байти відповідно до правил для звичайних текстових файлів, PDF-документів, конфігураційних файлів, зображень тощо.

Якщо ви назвете зображення кита у форматі PNG як “whale.mp3”, це не перетворить його якимось чарівним чином на запис пісні кита, хоча це може змусити операційну систему спробувати відкрити його за допомогою музичного плеєра, коли хтось двічі клікне на ньому.

Переміщення файлів і каталогів

Повернемося до каталогу shell-lesson-data/exercise-data/writing,

$ cd ~/Desktop/shell-lesson-data/exercise-data/writing

У нашому каталозі thesis є файл draft.txt. з не надто інформативною назвою, тому давайте змінимо назву файлу за допомогою команди mv, що є скороченням від ‘move’ (з англ. - ‘переміщати’):

$ mv thesis/draft.txt thesis/quotes.txt

Перший аргумент говорить “mv”, що ми ‘переміщаємо’, а другий - куди саме. У цьому випадку ми переміщуємо theis/draft.txt до theis/quotes.txt, що має той самий ефект, що і перейменування файлу. Звісно, ls показує нам, що thesis тепер містить один файл з назвою quotes.txt:

$ ls thesis
quotes.txt

Слід бути обережним при вказівці імені цільового файлу, оскільки mv приховано перезапише будь-який файл, що вже існує, з такою самою назвою, а це може призвести до втрати даних. Додатковий параметр mv -i (або mv --interactive, з англ. - ‘інтерактивно’), може бути використано для того, щоб змусити mv запитувати у вас підтвердження перед перезаписом.

Зверніть увагу, що mv також працює з каталогами.

Перемістимо quotes.txt до поточного робочого каталогу. Знову скористаємося mv, але цього разу ми використаємо лише назву каталогу як другий аргумент щоб повідомити mv, що ми хочемо зберегти назву файлу але перемістити файл у нове місце. (Ось чому команда називається ‘перемістити’). У цьому випадку ми використовуємо спеціальну назву . поточного каталогу, про яку ми згадували раніше.

$ mv thesis/quotes.txt .

Наслідком цього буде переміщення файла з каталогу, у якому він знаходився, до поточного робочого каталогу. Тепер ls показує нам, що thesis порожній:

$ ls thesis
$

Крім того, ми можемо переконатися, що файл quotes.txt більше не присутній у каталозі thesis, явно спробувавши показати інформацію про нього:

$ ls thesis/quotes.txt
ls: cannot access 'thesis/quotes.txt': No such file or directory

Команда ls з ім’ям файлу або каталогу в якості аргументу виводить лише список запитуваних файлів або каталогів. Якщо файл, вказаний як аргумент, не існує, термінал поверне помилку, як ми бачили вище. Ми можемо скористатися цим, щоб побачити, що файл quotes.txt знаходиться у нашому поточному каталозі:

$ ls quotes.txt
quotes.txt

Переміщення файлів до нової папки

Після виконання наступних команд Джеймі зрозуміла, що поклала файли sucrose.dat та maltose.dat не до того каталогу. Файли потрібно було покласти у каталог raw.

$ ls -F
analyzed/ raw/
$ ls -F analyzed
fructose.dat glucose.dat maltose.dat sucrose.dat
$ cd analyzed

Заповніть пропуски, щоб перемістити ці файли до теки raw/. (тобто туди, куди вона забула їх покласти)

$ mv sucrose.dat maltose.dat ____/____

Рішення

$ mv sucrose.dat maltose.dat ../raw

Пам’ятайте, що .. вказує на батьківський каталог (тобто на каталог, розташований вище поточного) і що . вказує на поточний каталог.

Копіювання файлів і каталогів

Команда cp працює дуже схоже на команду mv, за винятком того, що вона копіює файл, а не переміщує його. Ми можемо перевірити правильність її роботи за допомогою ls з двома шляхами в якості аргументів — як і більшості команд Unix, команді ls можна вказати одразу декілька шляхів:

$ cp quotes.txt thesis/quotations.txt
$ ls quotes.txt thesis/quotations.txt
quotes.txt   thesis/quotations.txt

Ми також можемо скопіювати каталог і весь його вміст за допомогою рекурсивної опції -r, наприклад, для створення резервної копії каталогу:

$ cp -r thesis thesis_backup

Ми можемо перевірити результат, переглянувши вміст каталогів thesis та thesis_backup:

$ ls thesis thesis_backup
thesis:
quotations.txt

thesis_backup:
quotations.txt

Перейменування файлів

Припустімо, що ви створили у поточному каталозі файл простого тексту, який містить список статистичних тестів, які вам знадобляться для аналізу ваших даних, і назвали його: statstics.txt.

Після створення і збереження цього файлу ви зрозуміли, що неправильно написали назву файлу! Ви хочете виправити помилку, яку з наведених нижче команд ви можете використати для цього?

  1. `cp statstics.txt статистика.txt
  2. `mv statstics.txt статистика.txt
  3. mv statstics.txt .
  4. cp statstics.txt .

Розв’язок

  1. Ні. Хоча це створить файл з правильною назвою, неправильно названий файл все одно існуватиме у каталозі, і його потрібно буде видалити.
  2. Так, це допоможе перейменувати файл.
  3. Ні, крапка (.) вказує, куди перемістити файл, але не надає нового імені файлу; однакові назви файлів не можуть бути створені.
  4. Ні, крапка (.) вказує, куди скопіювати файл, але не надає нового імені файлу; не можна створювати однакові імена файлів.

Переміщення та копіювання

Що виводить остання команда ls у наведеній нижче послідовності?

$ pwd
/Users/jamie/data
$ ls
proteins.dat
$ mkdir recombined
$ mv proteins.dat recombined/
$ cp recombined/proteins.dat ../proteins-saved.dat
$ ls
  1. proteins-saved.dat recombined
  2. recombined
  3. proteins.dat recombined.
  4. proteins-saved.dat.

Рішення

Ми розпочинаємо в каталозі /Users/jamie/data і створюємо нову папку з назвою recombined. Другий рядок переміщує (mv) файл proteins.dat до нового каталогу (recombined). Третій рядок робить копію файлу, який ми щойно перемістили. Складність полягає у тому, куди саме було скопійовано файл. Нагадаємо, що .. означає “піднятися на рівень вище”, тому скопійований файл тепер знаходиться у /Users/jamie. Зверніть увагу, що .. інтерпретується відносно поточного робочого каталогу, а не відносно розташування файла, який копіюється. Отже, єдине, що буде показано за допомогою команди ls/Users/jamie/data) - це каталог recombined.

  1. Ні, див. пояснення вище. Каталог proteins-saved.dat розташовано у каталозі /Users/jamie.
  2. Так
  3. Ні, див. пояснення вище. Файл proteins.dat знаходиться в каталозі /Users/jamie/data/recombined.
  4. Ні, див. пояснення вище. Файл proteins-saved.dat знаходиться в каталозі /Users/jamie.

Видалення файлів і каталогів

Повертаючись до каталогу shell-lesson-data/exercise-data/writing, давайте почистимо цей каталог, видаливши створений нами файл quotes.txt. Для цього ми скористаємося командою Unix rm (скорочення від англ. remove - видаляти):

$ rm quotes.txt

Ми можемо підтвердити, що файл був видалений, за допомогою ls:

$ ls quotes.txt
ls: cannot access 'quotes.txt': No such file or directory

Команда ls видаляє назавжди

В терміналі Unix немає кошика, з якого можна було б відновити видалені файли (хоча у більшості графічних інтерфейсів Unix він є). Замість цього коли ми видаляємо файли, вони від’єднуються від файлової системи, щоб їх місце на диску можна було використовувати повторно. Інструменти для пошуку та відновлення видалених файлів існують, але немає жодних гарантій, що вони працюватимуть у кожній конкретній ситуації, оскільки комп’ютер може повторно використати місце на диску, яке займав файл, одразу ж.

Безпечне використання rm

Що відбувається, коли ми виконуємо rm -i thesis_backup/quotations.txt? Навіщо нам потрібен цей захист при використанні rm?

Рішення

rm: видалити звичайний файл 'thesis_backup/quotations.txt'? y

Параметр -i буде запитуватися перед (кожним) вилученням (використовуйте Y для підтвердження вилучення або N, щоб зберегти файл). У командному терміналі Unix немає кошика для сміття, тому всі вилучені файли зникнуть назавжди. За допомогою опції -i ми можемо перевірити, що видаляємо лише ті файли, які ми хочемо видалити.

Якщо ми спробуємо видалити каталог thesis за допомогою rm thesis, ми отримаємо повідомлення про помилку:

$ rm thesis
rm: cannot remove `thesis': Is a directory

Це відбувається тому, що команда rm за замовчуванням працює лише з файлами, а не з каталогами.

Команда rm може видалити каталог і весь його вміст, якщо ми використаємо рекурсивний параметр -r, і вона зробить це без жодних запитів на підтвердження:

$ rm -r thesis

Враховуючи, що немає можливості відновити файли, видалені за допомогою терміналу, rm -r слід використовувати з великою обережністю. (ви можете розглянути можливість додавання інтерактивного параметра rm -r -i).

Операції з декількома файлами та каталогами

Часто потрібно скопіювати або перемістити кілька файлів одночасно. Це можна зробити, надавши список імен окремих файлів, або вказати шаблон імен за допомогою підстановочних знаків.

Копіювання з кількома іменами файлів

Для цієї вправи ви можете перевірити команди з каталогу shell-lesson-data/exercise-data.

Що робить команда cp у наведеному нижче прикладі, коли їй задано декілька імен файлів і назву каталогу?

$ mkdir backup
$ cp creatures/minotaur.dat creatures/unicorn.dat backup/

Що робить команда cp у наведеному нижче прикладі, коли їй задано три або більше імен файлів?

$ cd creatures
$ ls -F
basilisk.dat minotaur.dat unicorn.dat
$ cp minotaur.dat unicorn.dat basilisk.dat

Розв’язання

Якщо задано більше одного імені файлу, за яким наведене ім’я каталогу, (тобто, каталог призначення має бути останнім аргументом), команда cp копіює файли до вказаного каталогу.

Якщо задано три імені файлів, cp видасть помилку, подібну до наведеної нижче, оскільки очікує отримати ім’я каталогу як останній аргумент.

cp: target 'basilisk.dat' is not a directory

Використання символів підстановки для доступу до кількох файлів одночасно

Символи підстановки

Символ * - це символ підстановки, який відповідає нулю або більшій кількості будь-яких символів. Розглянемо каталог shell-lesson-data/exercise-data/proteins: *.pdb відповідає ethane.pdb, propane.pdb і кожному файлу, який закінчується на ‘.pdb’. З іншого боку, p*.pdb співпадає лише з pentane.pdb і propane.pdb, оскільки “p” спереду лише співпадає з назвами файлів, які починаються з літери ‘p’.

Символ ? також є символом підстановки, але він відповідає рівно одному будь-якому символу. Отже, ?ethane.pdb буде відповідати methane.pdb, тоді як *ethane.pdb відповідає як ethane.pdb, так і methane.pdb.

Підставні символи можна використовувати у поєднанні один з одним наприклад, ???ane.pdb відповідає трьом символам, за якими слідує ane.pdb, що дає cubane.pdb ethane.pdb octane.pdb.

Коли термінал бачить символ підстановки, він розгортає його для створення списку відповідних імен файлів до запуску команди, яку було введено. Як виняток, якщо вираз підстановки не відповідає жодному файлу, Bash передасть вираз як аргумент до команди, якою вона є. Наприклад, введення ls *.pdf у каталозі proteins (який містить лише файли з іменами, що закінчуються на .pdb) призведе до повідомлення про те, що не існує файла з назвою *.pdf. Втім, зазвичай команди на кшталт wc і ls показують списки > імен файлів, які відповідають цим виразам, але не самим символам підстановки. Саме термінал, а не інші програми, виконує розкриття символів підстановки.

Отримання переліку імен файлів, що відповідають шаблону

При виконанні в каталозі proteins, яка з команд ls видасть наступний результат?

ethane.pdb methane.pdb

  1. ls *t*ane.pdb
  2. ls *t?ne.*
  3. ls *t??ne.pdb
  4. ls ethane.*

Розв’язок

Розв’язком є 3.

1. показує всі файли, назви яких містять нуль або більше символів (*) далі йде літера t, потім нуль або більше символів (*) і далі ane.pdb. Це дасть ethane.pdb methane.pdb octane.pdb pentane.pdb.

2. показує всі файли, назви яких починаються з нуля або більше символів (*), за якими йде літера t, потім один будь-який символ (?), потім ne. і далі нуль або більше символів (*). Це дасть нам octane.pdb і pentane.pdb, але не збігається ні з чим, що закінчується на thane.pdb.

3. виправляє проблеми варіанта 2, зіставляючи два символи (??) між t і ne. Це і є рішення.

4. показує лише файли, що починаються з ethane..

Більше про символи підстановки

Сем має каталог, який містить дані калібрування, набори даних та описи наборів даних:

.
├── 2015-10-23-calibration.txt
├── 2015-10-23-dataset1.txt
├── 2015-10-23-dataset2.txt
├── 2015-10-23-dataset_overview.txt
├── 2015-10-26-calibration.txt
├── 2015-10-26-dataset1.txt
├── 2015-10-26-dataset2.txt
├── 2015-10-26-dataset_overview.txt
├── 2015-11-23-calibration.txt
├── 2015-11-23-dataset1.txt
├── 2015-11-23-dataset2.txt
├── 2015-11-23-dataset_overview.txt
├── backup
│   ├── calibration
│   └── datasets
└── send_to_bob
    ├── all_datasets_created_on_a_23rd
    └── all_november_files

Перед тим, як вирушити на чергову екскурсію, вона хоче створити резервну копію даних і надіслати деякі набори даних своєму колезі Бобу. Сем використовує наступні команди щоб виконати роботу:

$ cp *dataset* backup/datasets
$ cp ____calibration____ backup/calibration
$ cp 2015-____-____ send_to_bob/all_november_files/
$ cp ____ send_to_bob/all_datasets_created_on_a_23rd/

Допоможіть Сем, заповнивши пропуски.

Отримана структура каталогів повинна виглядати наступним чином

.
├── 2015-10-23-calibration.txt
├── 2015-10-23-dataset1.txt
├── 2015-10-23-dataset2.txt
├── 2015-10-23-dataset_overview.txt
├── 2015-10-26-calibration.txt
├── 2015-10-26-dataset1.txt
├── 2015-10-26-dataset2.txt
├── 2015-10-26-dataset_overview.txt
├── 2015-11-23-calibration.txt
├── 2015-11-23-dataset1.txt
├── 2015-11-23-dataset2.txt
├── 2015-11-23-dataset_overview.txt
├── backup
│   ├── calibration
│   │   ├── 2015-10-23-calibration.txt
│   │   ├── 2015-10-26-calibration.txt
│   │   └── 2015-11-23-calibration.txt
│   └── datasets
│       ├── 2015-10-23-dataset1.txt
│       ├── 2015-10-23-dataset2.txt
│       ├── 2015-10-23-dataset_overview.txt
│       ├── 2015-10-26-dataset1.txt
│       ├── 2015-10-26-dataset2.txt
│       ├── 2015-10-26-dataset_overview.txt
│       ├── 2015-11-23-dataset1.txt
│       ├── 2015-11-23-dataset2.txt
│       └── 2015-11-23-dataset_overview.txt
└── send_to_bob
    ├── all_datasets_created_on_a_23rd
    │   ├── 2015-10-23-dataset1.txt
    │   ├── 2015-10-23-dataset2.txt
    │   ├── 2015-10-23-dataset_overview.txt
    │   ├── 2015-11-23-dataset1.txt
    │   ├── 2015-11-23-dataset2.txt
    │   └── 2015-11-23-dataset_overview.txt
    └── all_november_files
        ├── 2015-11-23-calibration.txt
        ├── 2015-11-23-dataset1.txt
        ├── 2015-11-23-dataset2.txt
        └── 2015-11-23-dataset_overview.txt

Розв’язання

$ cp *calibration.txt backup/calibration
$ cp 2015-11-* send_to_bob/all_november_files/
$ cp *-23-dataset* send_to_bob/all_datasets_created_on_a_23rd/

Упорядкування каталогів і файлів

Джеймі працює над проєктом і бачить, що її файли не дуже добре впорядковані:

$ ls -F
analyzed/  fructose.dat    raw/   sucrose.dat

Файли fructose.dat та ucrose.dat містять результати її аналізу. Яку команду (команди), розглянуту (розглянуті) у цьому уроці, їй потрібно виконати, щоб наведені нижче команди створили показані нижче результати?

$ ls -F
analyzed/   raw/
$ ls analyzed
fructose.dat    sucrose.dat

Розв’язання

mv *.dat analyzed

Джеймі потрібно перемістити файли fructose.dat та ucrose.dat до каталогу analyzed. Термінал розширить шаблон *.dat так, щоб він відповідав усім файлам .dat у поточному каталозі. Команда mv перемістить сформований перелік файлів .dat до каталогу ‘analyzed’.

Відтворити структуру папок

Ви починаєте новий експеримент і хочете продублювати структуру каталогу з попереднього експерименту, щоб ви могли додати нові дані.

Припустимо, що попередній експеримент знаходиться у каталозі з назвою 2016-05-18, який містить каталог data, який, у свою чергу, містить каталоги raw і processed, які містять файли даних. Мета полягає у копіюванні структури папок каталогу 2016-05-18 до каталогу з назвою 2016-05-20 таким чином, щоб ваша фінальна структура каталогів виглядала наступним чином:

2016-05-20/
└── data
   ├── processed
   └── raw

Який з наведених нижче наборів команд досягне цієї мети? Що зроблять інші команди?

$ mkdir 2016-05-20
$ mkdir 2016-05-20/data
$ mkdir 2016-05-20/data/processed
$ mkdir 2016-05-20/data/raw
$ mkdir 2016-05-20
$ cd 2016-05-20
$ mkdir data
$ cd data
$ mkdir raw processed
$ mkdir 2016-05-20/data/raw
$ mkdir 2016-05-20/data/processed
$ mkdir -p 2016-05-20/data/raw
$ mkdir -p 2016-05-20/data/processed
$ mkdir 2016-05-20
$ cd 2016-05-20
$ mkdir data
$ mkdir raw processed

Розв’язання

Перші два набори команд досягають цієї мети. Перший набір використовує відносні шляхи для створення каталогу верхнього рівня перед підкаталогами.

Третій набір команд призведе до помилки, оскільки поведінка mkdir за замовчуванням не створює підкаталог в каталозі, що не існує: спочатку мають бути створені каталоги проміжних рівнів.

Четвертий набір команд досягає цієї мети. Пам’ятайте, опція -p, за яким слідує шлях до одного або декількох каталогів, змусить mkdir створити будь-які проміжні підкаталоги за потреби.

Останній набір команд створить каталоги ‘raw’ і ‘processed’ на тому ж рівні, що і каталог ‘data’.

[workshop-repo]: [yaml]: http://yaml.org/

Ключові моменти