Работа с файлами и каталогами

08.09.2021

Теперь мы знаем, как исследовать файлы и каталоги, но как мы вообще их создаем?

Шаг первый: посмотрите, где мы находимся и что у нас уже есть

Вернемся к нашему каталогу shell-lesson-data на рабочем столе и воспользуемся ls -F, чтобы посмотреть, что он содержит:

Создать каталог

Давайте создадим новый каталог под названием thesis, используя команду mkdir thesis (которая не имеет вывода):

Как можно догадаться по названию, mkdir означает «создать каталог». Поскольку thesis является относительным путем (т. Е. Не имеет ведущей косой черты, например / what / ever / thesis), новый каталог создается в текущем рабочем каталоге:

Поскольку мы только что создали каталог диссертаций, в нем еще ничего нет:

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

Параметр -R команды ls выводит список всех вложенных подкаталогов в каталоге. Давайте воспользуемся ls -FR, чтобы рекурсивно перечислить новую иерархию каталогов, которую мы только что создали в каталоге проекта:

Два способа сделать одно и то же

Использование оболочки для создания каталога ничем не отличается от использования файлового проводника. Если вы откроете текущий каталог с помощью графического файлового менеджера вашей операционной системы, каталог thesis также появится там. Хотя оболочка и файловый менеджер - это два разных способа взаимодействия с файлами, сами файлы и каталоги одинаковы.

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

  1. Не используйте пробелы.

    Пробелы могут сделать имя более значимым, но поскольку пробелы используются для разделения аргументов в командной строке, лучше избегать их в именах файлов и каталогов. Вместо этого вы можете использовать - или _ (например, северно-тихоокеанский круговорот /, а не северный тихоокеанский круговорот /).

  2. Не начинайте имя с - (тире).

    Команды рассматривают имена, начинающиеся с -, как параметры.

  3. Придерживайтесь букв, цифр,. (точка или «точка»), - (тире) и _ (подчеркивание).

    Многие другие символы имеют в командной строке особое значение. Мы узнаем о некоторых из них на этом уроке. Существуют специальные символы, которые могут привести к тому, что ваша команда не будет работать должным образом, и даже может привести к потере данных.

Создать текстовый файл

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

Какой редактор?

Когда мы говорим «nano - это текстовый редактор», мы действительно имеем в виду «текст»: он может работать только с простыми символьными данными, а не с таблицами, изображениями или любыми другими удобными для человека носителями. Мы используем его в примерах, потому что это один из наименее сложных текстовых редакторов. Однако из-за этой черты он может быть недостаточно мощным или гибким для работы, которую вам нужно выполнить после этого семинара. В системах Unix (таких как Linux и macOS) многие программисты используют Emacs или Vim (оба из которых требуют больше времени для изучения) или графический редактор, такой как Gedit. В Windows вы можете использовать Notepad ++. В Windows также есть встроенный редактор под названием блокнот, который можно запустить из командной строки так же, как и в nano для целей этого урока.

Независимо от того, какой редактор вы используете, вам нужно знать, где он ищет и сохраняет файлы. Если вы запустите его из оболочки, он (вероятно) будет использовать ваш текущий рабочий каталог в качестве местоположения по умолчанию. Если вы используете меню «Пуск» вашего компьютера, возможно, вместо этого он захочет сохранить файлы на вашем рабочем столе или в каталоге документов. Вы можете изменить это, перейдя в другой каталог при первом нажатии кнопки «Сохранить как…».

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

После сохранения файла мы можем использовать Ctrl + X, чтобы выйти из редактора и вернуться в оболочку.

Control, Ctrl или клавиша ^

  • Control-X
  • Ctrl + X
  • Ctrl-X
  • Ctrl + X
  • ^ X
  • Сх

nano не оставляет никаких выходных данных на экране после выхода, но теперь ls показывает, что мы создали файл с именем draft.txt:

Создание файлов другим способом

Мы видели, как создавать текстовые файлы с помощью редактора nano. Теперь попробуйте следующую команду:

  1. Что сделала сенсорная команда? Когда вы просматриваете текущий каталог с помощью проводника файлов с графическим интерфейсом, отображается ли файл?

  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. Некоторые программы сами не генерируют выходные файлы, а вместо этого требуют, чтобы уже были созданы пустые файлы. Когда программа запускается, она ищет существующий файл, чтобы заполнить его выводом. Сенсорная команда позволяет эффективно создавать пустой текстовый файл, который будет использоваться такими программами.

Что в имени?

Возможно, вы заметили, что все файлы Нелле называются «что-то точечно», и в этой части урока мы всегда использовали расширение .txt. Это просто соглашение: мы можем назвать файл мифом или почти что угодно еще. Однако большинство людей чаще всего используют имена, состоящие из двух частей, чтобы помочь им (и их программам) различать разные типы файлов. Вторая часть такого имени называется расширением имени файлаи указывает, какой тип данных содержит файл: .txt указывает на простой текстовый файл, .pdf указывает на документ PDF, .cfg - это файл конфигурации, полный параметров для какой-либо программы или другое, .png - изображение PNG и т. д.

Это просто условность, хотя и важная. Файлы содержат байты: мы и наши программы должны интерпретировать эти байты в соответствии с правилами для текстовых файлов, документов PDF, файлов конфигурации, изображений и т. Д.

Присвоение имени PNG-изображению кита whale.mp3 не превращает его каким-то волшебным образом в запись песни кита, хотя это может привести к тому, что операционная система попытается открыть его с помощью музыкального проигрывателя, когда кто-то дважды щелкнет по нему.

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

Вернувшись в каталог данных урока оболочки,

В нашем каталоге thesis у нас есть файл draft.txt, имя которого не особо информативно, поэтому давайте изменим имя файла с помощью mv, что является сокращением от «move»:

Первый аргумент сообщает mv, что мы «перемещаем», а второй - куда нужно идти. В этом случае мы перемещаем thesis / draft.txt в thesis / quotes.txt, что имеет тот же эффект, что и переименование файла. Конечно же, ls показывает нам, что thesis теперь содержит один файл с именем quotes.txt:

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

Обратите внимание, что mv также работает с каталогами.

Переместим файл quotes.txt в текущий рабочий каталог. Мы снова используем mv, но на этот раз мы будем использовать только имя каталога в качестве второго аргумента, чтобы сообщить mv, что мы хотим сохранить имя файла, но поместить файл в новое место. (Вот почему команда называется «переместить».) В этом случае имя каталога, которое мы используем, является специальным именем каталога. что мы упоминали ранее.

В результате файл перемещается из каталога, в котором он находился, в текущий рабочий каталог. ls теперь показывает нам, что тезис пуст:

В качестве альтернативы мы можем подтвердить, что файла quotes.txt больше нет в каталоге thesis, явно попытавшись его перечислить:

ls с именем файла или каталогом в качестве аргумента перечисляет только запрошенный файл или каталог. Если файл, указанный в качестве аргумента, не существует, оболочка возвращает ошибку, как мы видели выше. Мы можем использовать это, чтобы увидеть, что файл quotes.txt теперь присутствует в нашем текущем каталоге:

Перемещение файлов в новую папку

После выполнения следующих команд Джейми понимает, что она поместила файлы сахарозы.dat и maltose.dat не в ту папку. Файлы должны были быть помещены в необработанную папку.

Заполните пустые поля, чтобы переместить эти файлы в папку raw / (то есть в ту, которую она забыла вставить)

Решение

Напомним, что .. относится к родительскому каталогу (то есть к тому, который находится над текущим каталогом) и тому подобное. относится к текущему каталогу.

Копирование файлов и каталогов

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

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

Мы можем проверить результат, перечислив содержимое как каталога thesis, так и каталога thesis_backup:

Переименование файлов

  1. cp statstics.txt statistics.txt
  2. mv statstics.txt statistics.txt
  3. mv statstics.txt.
  4. cp statstics.txt.

Решение

  1. Нет. Хотя это приведет к созданию файла с правильным именем, файл с неправильным именем все еще существует в каталоге и его необходимо удалить.
  2. Да, это сработает для переименования файла.
  3. Нет, точка (.) Указывает, куда переместить файл, но не дает нового имени файла; одинаковые имена файлов не могут быть созданы.
  4. Нет, точка (.) Указывает, куда копировать файл, но не указывает новое имя файла; одинаковые имена файлов не могут быть созданы.

Перемещение и копирование

Каков результат закрытия команды ls в последовательности, показанной ниже?

  1. белки-сохраненные.dat рекомбинированы
  2. рекомбинированный
  3. протеины.dat рекомбинированы
  4. белки-сохраненные.dat

Решение

  1. Нет, см. Объяснение выше. Protein-saved.dat находится в / Users / jamie
  2. да
  3. Нет, см. Объяснение выше. протеины.dat находится в / Users / jamie / data / Recombined
  4. Нет, см. Объяснение выше. Protein-saved.dat находится в / Users / jamie

Удаление файлов и каталогов

Вернувшись в каталог данных-урока-оболочки, давайте приведем в порядок этот каталог, удалив созданный нами файл quotes.txt. Для этого мы будем использовать команду Unix: rm (сокращение от «удалить»):

Мы можем подтвердить удаление файла с помощью ls:

Удаление навсегда

Оболочка Unix не имеет корзины, из которой мы можем восстанавливать удаленные файлы (хотя большинство графических интерфейсов к Unix имеют). Вместо этого, когда мы удаляем файлы, они отключаются от файловой системы, чтобы их дисковое пространство можно было повторно использовать. Инструменты для поиска и восстановления удаленных файлов существуют, но нет гарантии, что они будут работать в какой-либо конкретной ситуации, поскольку компьютер может сразу же переработать дисковое пространство файла.

Безопасное использование rm

Что происходит, когда мы выполняем rm -i thesis_backup / quotations.txt? Зачем нам нужна эта защита при использовании rm?

Решение

Параметр -i будет запрашивать перед (каждым) удалением (используйте Y, чтобы подтвердить удаление, или N, чтобы сохранить файл). В оболочке Unix нет корзины для мусора, поэтому все удаленные файлы исчезнут навсегда. Используя параметр -i, у нас есть возможность проверить, что мы удаляем только те файлы, которые хотим удалить.

Если мы попытаемся удалить каталог thesis с помощью rm thesis, мы получим сообщение об ошибке:

Это происходит потому, что rm по умолчанию работает только с файлами, а не с каталогами.

rm может удалить каталог и все его содержимое, если мы используем рекурсивную опцию -r, и это будет сделано без каких-либо запросов на подтверждение :

Учитывая, что нет возможности получить файлы, удаленные с помощью оболочки, rm -r следует использовать с большой осторожностью (вы можете подумать о добавлении интерактивной опции rm -r -i).

Операции с несколькими файлами и каталогами

Часто бывает необходимо скопировать или переместить сразу несколько файлов. Это можно сделать, предоставив список отдельных имен файлов или указав шаблон именования с использованием подстановочных знаков.

Копировать с несколькими именами файлов

В этом упражнении вы можете протестировать команды в каталоге shell-lesson-data / data.

В приведенном ниже примере, что делает cp, когда задано несколько имен файлов и имя каталога?

В приведенном ниже примере, что делает cp при трех или более именах файлов?

Решение

Если указано более одного имени файла, за которым следует имя каталога (т.е. каталог назначения должен быть последним аргументом), cp копирует файлы в указанный каталог.

Если задано три имени файла, cp выдает ошибку, подобную приведенной ниже, потому что он ожидает имя каталога в качестве последнего аргумента.

Использование подстановочных знаков для одновременного доступа к нескольким файлам

Подстановочные знаки

* - это подстановочный знак, который соответствует нулю или более символам. Давайте рассмотрим каталог shell-lesson-data / sizes: * .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 в каталоге молекул (который содержит только файлы с именами, заканчивающимися на .pdb) появляется сообщение об ошибке, что нет файла с именем * .pdf. Однако обычно такие команды, как wc и ls, видят списки имен файлов, соответствующих этим выражениям, но не сами символы подстановки. Расширением подстановочных знаков занимается оболочка, а не другие программы, и это еще один пример ортогонального дизайна.

Список имен файлов, соответствующих шаблону

  1. ls * t * ane.pdb
  2. ls * t? ne. *
  3. ls * t ?? ne.pdb
  4. ls этан. *

Решение

Решение 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. показывает только файлы, начинающиеся с этана. .

Подробнее о подстановочных знаках

У Сэма есть каталог, содержащий данные калибровки, наборы данных и описания наборов данных:

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

Помогите Сэму, заполнив поля.

Результирующая структура каталогов должна выглядеть так

Сергей Иващенко

08.09.2021

Подписывайтесь на наши социальные сети!