Список всех файлов и каталогов в каталоге + подкаталогах

Я хочу перечислить все файлы и каталоги, содержащиеся в каталоге и подкаталогах этого каталога. Если я выберу C: в качестве каталога, программа получит каждое имя каждого файла и папки на жестком диске, к которым у нее есть доступ.

Список может выглядеть как

 fd  1.txtfd  2.txtfd  a  fd  b  fd  a  1.txtfd  a  2.txtfd  a  a  fd  a  b  fd  b  1.  txtfd  b  2.txtfd  b  afd  b  bfd  a  a  1.txtfd  a  a  a  fd  a  b  1.txtfd  a  b  afd  b  a   1.txtfd  b  a  a  fd  b  b  1.txtfd  b  b  a 

  string [] allfiles = Directory.GetFiles ("путь/к/каталогу", "*. *", SearchOption.AllDirectories);  

где *. * — шаблон для сопоставления файлов

Если Каталог также необходим, вы можете сделать это следующим образом:

  foreach (файл var во всех файлах) {FileInfo info = new FileInfo (файл); //Сделаем что-нибудь с Папкой или просто добавим их в список через nameoflist.add ();  }  

7


Directory.GetFileSystemEntries существует в .NET 4.0+ и возвращает как файлы, так и каталоги. Назовите это так:

  string [] entries = Directory.GetFileSystemEntries (path, "*", SearchOption.AllDirectories);  

Обратите внимание, что он не справится с попытками перечислить содержимое подкаталогов, к которым у вас нет доступа (UnauthorizedAccessException), но этого может быть достаточно для ваших нужд.

1


Используйте GetDirectories и GetFiles для получения папок и файлов.

Используйте SearchOption AllDirectories , чтобы получить папки и файлы также во вложенных папках.

4


  общедоступный статический void DirectorySearch (строка dir) {попробуйте {foreach (строка f в Directory.GetFiles (dir)) {Console.WriteLine (Path.GetFileName (f));  } foreach (строка d в ​​Directory.GetDirectories (каталог)) {Console.WriteLine (Path.GetFileName (d));  DirectorySearch (d);  }} catch (System.Exception ex) {Console.WriteLine (ex.Message);  }}  

Примечание: функция показывает только имена без относительных путей.

2


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

  List  AllFiles = new List  (); void ParsePath (string path) {string [] SubDirs = Directory.GetDirectories (path);  AllFiles.AddRange (Подкаталоги);  AllFiles.AddRange (Directory.GetFiles (путь));  foreach (строка subdir в SubDirs) ParsePath (subdir);}  

Совет: вы можете использовать FileInfo и DirectoryInfo , если вам нужно проверить какой-либо конкретный атрибут.


I используйте следующий код с формой, имеющей 2 кнопки: одна для выхода, а другая для запуска. Диалог браузера папок и диалог сохранения файла. Код указан ниже и работает в моей системе Windows10 (64):

  using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System  .Data; использование System.Drawing; использование System.Linq; использование System.Text; использование System.Windows.Forms; пространство имен Directory_List {публичный частичный класс Form1: Form {публичная строка MyPath = "";  публичная строка MyFileName = "";  публичная строка str = "";  общедоступная Form1 () {InitializeComponent ();  } private void cmdQuit_Click (отправитель объекта, EventArgs e) {Application.Exit ();  } private void cmdGetDirectory_Click (отправитель объекта, EventArgs e) {folderBrowserDialog1.ShowDialog ();  MyPath = folderBrowserDialog1.SelectedPath;  saveFileDialog1.ShowDialog ();  MyFileName = saveFileDialog1.FileName;  str = "Папка =" + MyPath + " r  n  r  n  r  n";  DirectorySearch (MyPath);  var result = MessageBox.Show («Каталог сохранен на диск!», «», MessageBoxButtons.OK);  Application.Exit ();  } public void DirectorySearch (string dir) {try {foreach (string f in Directory.GetFiles (dir)) {str = str + dir + "\" + (Path.GetFileName (f)) + " r  n"  ;  } foreach (строка d в ​​Directory.GetDirectories (dir, «*»)) {DirectorySearch (d);  } System.IO.File.WriteAllText (MyFileName, str);  } catch (System.Exception ex) {Console.WriteLine (ex.Message);  }}}}  


Вы можете использовать FindFirstFile, который возвращает дескриптор, а затем рекурсивно вызывает функцию, которая вызывает FindNextFile. Это хороший подход, так как указанная структура будет заполнена различными данными, такими как AlternativeName, lastTmeCreated, modified, атрибуты и т. д.

Но поскольку вы используете платформу .net, вам придется войти в неуправляемую область.


Некоторая улучшенная версия с максимальным уровнем lvl для перехода в каталог и возможностью исключения папок:

  using System; using System. IO; class MainClass {public static void Main (string [] args) {var dir = @ "C:  directory  to  print";  PrintDirectoryTree (каталог, 2, новая строка [] {"folder3"});  } public static void PrintDirectoryTree (string directory, int lvl, string [] excludedFolders = null, string lvlSeperator = "") {excludedFolders = excludedFolders ??  новая строка [0];  foreach (строка f в Directory.GetFiles (каталог)) {Console.WriteLine (lvlSeperator + Path.GetFileName (f));  } foreach (строка d в ​​Directory.GetDirectories (каталог)) {Console.WriteLine (lvlSeperator + "-" + Path.GetFileName (d));  если (lvl> 0 && Array.IndexOf (excludedFolders, Path.GetFileName (d))  

входной каталог:

  -folder1 file1.txt -folder2 file2.txt -folder5 file6.txt -  folder3 file3.txt -folder4 file4.txt file5.txt  

вывод функции (содержимое folder5 исключено из-за ограничения lvl, а содержимое folder3 исключено, потому что оно находится в excludedFolders массив):

  -folder1 file1.txt -folder2 file2.txt -folder5 -folder3 -folder4 file4.txt file5.txt  


  с использованием System.IO; с использованием  System.Text; string [] filePaths = Directory.GetFiles (@ "путь", "*. *", SearchOption.AllDirectories);  

2


Если у вас нет доступа к подпапке внутри дерева каталогов, Directory.GetFiles останавливается и выдает исключение что приводит к нулевому значению в принимающей строке [].

Вот этот ответ https://stackoverflow.com/a/38959208/6310707

Он управляет исключением внутри цикла и продолжает работать до тех пор, пока не будет вся папка пройден.


логический и упорядоченный способ:

  using System; using System.Collections.Generic; using System.IO; using System.Reflection; namespace DirLister {class Program {public static void Main (  string [] args) {//с отражением я получаю каталог, в котором работает эта программа, таким образом перечисляя все файлы оттуда и все подкаталоги string [] st = FindFileDir (Path.GetDirectoryName (Assembly.GetEntryAssembly (). Location))  ;  using (StreamWriter sw = new StreamWriter ("isting.txt ", false)) {foreach (string s in st) {//Я пишу то, что нашел, в текстовом файле sw. WriteLine (s);  }}} частная статическая строка [] FindFileDir (строка beginpath) {Список  findlist = новый список  (); /* Я начинаю рекурсию в следующем порядке: * - Вставить все файлы в текущий каталог с рекурсией * - Вставить все подкаталоги в список и заново начать рекурсию оттуда до конца */RecurseFind (beginpath, findlist);  вернуть findlist.ToArray ();  } private static void RecurseFind (строковый путь, список  список) {строка [] fl = Directory.GetFiles (путь);  строка [] dl = Directory.GetDirectories (путь);  if (fl.Length> 0 || dl.Length> 0) {//Я начинаю с файлов и сохраняю их все в списке foreach (строка s в fl) list.Add (s); //Затем я добавляю каталог и рекурсивно просматриваю этот каталог, процесс будет повторяться до тех пор, пока не останется больше файлов и каталогов для рекурсии foreach (строка s в dl) {list.Add (s);  RecurseFind (s, список);  }}}}}  

2


В следующем примере самый быстрый (не распараллеленный) способ перечисления файлов и подпапок в дереве каталогов, обрабатывающих исключения. Было бы быстрее использовать Directory.EnumerateDirectories с помощью SearchOption.AllDirectories для перечисления всех каталогов, но этот метод завершится ошибкой, если попадет в UnauthorizedAccessException или PathTooLongException.

Использует общий тип коллекции Stack, который является стеком «последний пришел — первым вышел» (LIFO) и не использует рекурсию. Из https://msdn.microsoft.com/en-us/library/bb513869.aspx, позволяет перечислить все подкаталоги и файлы и эффективно обрабатывать эти исключения.

  public class StackBasedIteration {static void Main (string [] args) {//Укажите начальную папку в командной строке или//Visual Studio в панели Project> Properties> Debug.  TraverseTree (args [0]);  Console.WriteLine («Нажать любую клавишу»);  Console.ReadKey ();  } public static void TraverseTree (string root) {//Структура данных для хранения имен вложенных папок,//проверяемых на наличие файлов.  Стек  dirs = новый Стек  (20);  если (! System.IO.Directory.Exists (корень)) {выбросить новое исключение ArgumentException ();  } dirs.Push (корень);  while (dirs.Count> 0) {строка currentDir = dirs.Pop ();  строка [] subDirs;  попробуйте {subDirs = System.IO.Directory.EnumerateDirectories (currentDir); //TopDirectoryOnly}//Исключение UnauthorizedAccessException будет выброшено, если у нас нет//разрешения на обнаружение в папке или файле.  Может быть приемлемым или неприемлемым//игнорировать исключение и продолжить перечисление//оставшихся файлов и папок.  Также возможно (но маловероятно), что будет вызвано//исключение DirectoryNotFound.  Это произойдет, если//currentDir был удален другим приложением или потоком после нашего вызова Directory.Exists. Выбор//исключений для перехвата полностью зависит от конкретной задачи,//которую вы собираетесь выполнять, а также от того, сколько вы знаете с уверенностью//о системах, в которых будет выполняться этот код.  catch (UnauthorizedAccessException e) {Console.WriteLine (e.Message);  Продолжить;  } catch (System.IO.DirectoryNotFoundException e) {Console.WriteLine (e.Message);  Продолжить;  } строка [] files = null;  попробуйте {файлы = System.IO.Directory.EnumerateFiles (currentDir);  } catch (UnauthorizedAccessException e) {Console.WriteLine (e.Message);  Продолжить;  } catch (System.IO.DirectoryNotFoundException e) {Console.WriteLine (e.Message);  Продолжить;  }//Выполняем необходимые действия с каждым файлом здесь. //Измените этот блок для выполнения необходимой задачи.  foreach (строковый файл в файлах) {try {//Выполните все действия, которые требуются в вашем сценарии.  System.IO.FileInfo fi = новый System.IO.FileInfo (файл);  Console.WriteLine ("{0}: {1}, {2}", fi.Name, fi.Length, fi.CreationTime);  } catch (System.IO.FileNotFoundException e) {//Если файл был удален отдельным приложением//или потоком после вызова TraverseTree ()//, просто продолжайте.  Console.WriteLine (e.Message);  Продолжить;  } catch (UnauthorizedAccessException e) {Console.WriteLine (e.Message);  Продолжить;  }}//Помещаем подкаталоги в стек для обхода. //Это также можно сделать перед передачей файлов.  foreach (строка str в subDirs) dirs.Push (str);  }}}  

2


При этом вы можете просто запустить их и выбрать подпапку при запуске консоли

  using System; using System.Collections.Generic; using System.IO; using System  .Linq; используя System.Security.Cryptography; используя System.Text; используя data.Patcher; //Патчер XMLnamespace PatchBuilder {class Program {static void Main (string [] args) {string patchDir;  if (args.Length == 0) {Console.WriteLine ("Укажите каталог исправлений в аргументе");  patchDir = Console.ReadLine ();  } еще {patchDir = args [0];  } if (File.Exists (Path.Combine (patchDir, "patch.xml"))) File.Delete (Path.Combine (patchDir, "patch.xml"));  var files = Directory.EnumerateFiles (patchDir, "*", SearchOption.AllDirectories) .OrderBy (p => p) .ToList ();  foreach (файл var в files.Where (file => file.StartsWith ("patch \ Resources")). ToArray ()) {files.Remove (файл);  files.Add (файл);  } var tasks = новый список  ();  используя (var md5Hasher = MD5.Create ()) {для (int i = 0; i  0?  folderSplitted.Last (): ""; //возвращаем "остаток"}}}  

и это патчар для экспорта XML

  с использованием System.Xml.Serialization  ; данные пространства имен.Patcher {открытый класс MetaFile {[XmlArray ("Задачи")] общедоступный MetaFileEntry [] Задачи {получить;  набор;  } [XmlAttribute ("контрольная сумма")] общедоступная строка FolderChecksum {получить;  набор;  }}}  


A littlebit просто и медленно, но работает !! если вы не указываете путь к файлу, в основном используйте «fixPath», это всего лишь пример …. вы можете искать правильный fileType, что хотите, я сделал ошибку, когда выбрал имя списка, потому что временный список файлов — это список файлов, в которых выполняется поиск, так что продолжайте … а список ошибок говорит сам за себя.

  static public void Search (string path  , string fileType, List  timeFileList, List  errorList) {List  timeDirectories = new List  ();//исправление строки = @ "C:  Users " + Environment.UserName + @  ""; string fix = @ "C: "; string folder = "";//Alap útvonal megadása if (path.Length! = 0) {folder = path;} else {path = fix;} int j =  0; int equals = 0; bool end = true; do {equals = j; int k = 0; попробуйте {int folderNumber = Directory.GetDirec  тории (папки) .Count ();  int fileNumber = Directory.GetFiles (папки) .Count ();  if ((folderNumber! = 0 || fileNumber! = 0) && equals == j) {for (int i = k; k  


Создать список строк

  общедоступный статический список  HTMLFiles = new List  ();  private void Form1_Load (отправитель объекта, EventArgs e) {HTMLFiles.AddRange (Directory.GetFiles (@ "C:  DataBase", "* .txt"));  foreach (элемент var в файлах HTML) {MessageBox.Show (элемент);  }}  

1



Содержание
  1. Работа с файлами и каталогами
  2. Обзор
  3. Создание каталогов
  4. Шаг первый: посмотрите, где мы находимся и что у нас уже есть
  5. Создать каталог
  6. Два способа сделать одно и то же
  7. Хорошие имена для файлов и каталогов
  8. Создайте текстовый файл
  9. Какой редактор?
  10. Клавиша Control, Ctrl или ^
  11. Создание файлов Другой способ
  12. Решение
  13. Что в A Имя?
  14. Перемещение файлов и каталогов
  15. Перемещение файлов в новую папку
  16. Решение
  17. Копирование файлов и каталогов
  18. Переименование файлов
  19. Решение
  20. Перемещение и копирование
  21. Решение
  22. Удаление файлов и каталогов
  23. Удаление навсегда
  24. Использование rm Safely
  25. Решение
  26. Операции с несколькими файлами и каталогами
  27. Копировать с несколькими именами файлов
  28. Решение
  29. Использование подстановочных знаков для одновременного доступа к нескольким файлам
  30. Подстановочные знаки
  31. Список имен файлов, соответствующих шаблону
  32. Решение
  33. Подробнее о подстановочных знаках
  34. Решение
  35. Организация каталогов и файлов
  36. Решение
  37. Воспроизвести структуру папок
  38. Решение
  39. Ключевые моменты

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

Обзор

Обучение: 30 мин.
Упражнения: 20 мин.
Вопросы
  • Как я могу создавать, копировать и удалять файлы и каталоги?

  • Как я могу редактировать файлы?

Цели
  • Создание иерархии каталогов, соответствующей данной диаграмме.

  • Создавать файлы в этой иерархии с помощью редактора или путем копирования и переименования существующих файлов.

  • Удалять, копировать и перемещать указанные файлы и/ или каталоги.

Создание каталогов

Теперь мы знаем, как исследовать fil es и каталоги, но как нам их создать в первую очередь?

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

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

  $ pwd  

 /Пользователи/ nelle/Desktop/data-shell  

  $ ls -F  

  creatures/data/sizes/north-pacific-gyre/notes.txt pizza.  cfg solar.pdf writing/ 

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

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

   $ mkdir thesis  

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

  $ ls -F  

  существа/данные/молекулы/north-pacific-gyre/notes.txt pizza.cfg solar.pdf thesis/writing/ 

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

  $ ls -F  thesis  

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

  $ mkdir -p thesis/chapter_1/section_1/subsction_1  

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

  $ ls -FR thesischapter_1/thesis/chapter_1: section_1/thesis/chapter_1/section_1: subsction_1/thesis/chapter_1/section_1/subsction_1:  

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

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

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

Сложные имена файлов и каталогов могут сделать вашу жизнь болезненной при работе в командной строке. Здесь мы предлагаем несколько полезных советов по именам ваших файлов.

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

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

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

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

  3. Используйте буквы, цифры, . (точка или ‘точка’), - (тире) и _ (подчеркивание).

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

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

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

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

  $ cd thesis $ nano draft.txt  

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

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

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

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

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

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

Клавиша Control также называется клавишей Ctrl. Есть разные способы, которыми можно описать использование клавиши Control. Например, вы можете увидеть инструкцию нажать клавишу Control и, удерживая ее, нажать клавишу X , описанную как любое из:

  • Control-X
  • Control+X
  • Ctrl-X
  • Ctrl+X
  • ^ X
  • Cx

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

Что в A Имя?

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

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

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

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

Возврат в каталог data-shell ,

  cd ~/Desktop/data-shell/ 

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

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

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

  $ 1 тезис  

  quotes.txt  

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

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

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

  $ mv thesis/quotes.txt.  

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

  $ ls thesis  

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

  $ ls quotes.txt  

  кавычки. txt  

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

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

  $ ls -F analysis/ raw/$ ls -F анализируемый фруктоза.dat глюкоза.dat мальтоза.dat сахароза.dat $ cd проанализированный  

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

  $  mv sugarrose.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.txtthesis_backup: quotations.txt  

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

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

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

  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 в последовательности, показанной ниже?

  $ pwd  

/Users/jamie/data

  $ ls  

proteins.dat

  $  mkdir рекомбинировал $ mv протеины.dat рекомбинировал/$ cp рекомбинировал/протеины.dat ../proteins-saved.dat$ ls  

  1. белки-save.dat рекомбинированы
  2. recombined
  3. протеины.dat рекомбинированы
  4. proteins-saved.dat

Решение

Мы начинаем с каталога /Users/jamie/data и создаем новую папку с именем Recombined . вторая строка перемещает ( mv ) файл протеины.dat в новую папку ( Recombined ). Третья строка делает копия файла, который мы только что переместили. Сложная часть здесь — это то, куда был скопирован файл. Напомним, что .. означает «подняться на уровень выше», поэтому скопированный файл теперь находится в папке /Users/jamie . Обратите внимание на этот . . интерпретируется по отношению к текущему рабочему каталогу, не по отношению к местоположению копируемого файла. Итак, единственное, что будет отображаться с использованием ls (в /Users/jamie/data ) — это рекомбинированная папка.

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

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

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

  $ rm quotes.txt  

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

  $ ls quotes.txt  

  ls: нет доступа к кавычкам. txt ': такого файла или каталога нет  

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

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

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

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

Решение

  $ rm: удалить обычный файл 'thesis_backup/quotations.txt'?  y  

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

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

  $ rm thesis  

  rm: невозможно удалить `  thesis ': это каталог  

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

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

  $ rm -r thesis  

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

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

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

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

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

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

  $ mkdir backup $ cp amino-acid.txt animals.txt backup/ 

Что в приведенном ниже примере делает cp , когда задано три или более имен файлов?

  $ ls -F  

  аминокислоты. txt animals.txt backup/elements/morse.txt pdb/planets.txt salmon.txt sunspot.txt  

  $ cp amino-acid.txt animals.txt morse.txt  

Решение

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

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

  cp: target 'morse.txt' не является каталогом  

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

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

* — это подстановочный знак , который соответствует нулю или более символов. Давайте рассмотрим каталог data-shell/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 .

Подстановочные знаки можно использовать в сочетании с каждым из них. g. ??? ane.pdb соответствует трем символам, за которыми следует ane.pdb , что дает cubane.pdb ethane.pdb octane.pdb .

Когда оболочка видит подстановочный знак, она расширяет подстановочный знак для создания списка совпадающих имен файлов перед выполнением запрошенной команды. В качестве исключения, если выражение с подстановочными знаками не соответствует файлу, Bash передаст выражение в качестве аргумента команде, как и есть. Например, набрав ls * .pdf в каталоге modules (который содержит только файлы с именами, заканчивающимися на .pdb ) приводит к сообщению об ошибке, что файл с именем *. pdf отсутствует. Однако обычно команды, такие как wc и ls , см. списки имен файлов, соответствующих этим выражениям, но не сами символы подстановки. Это оболочка, а не другие программы, которые имеют дело с расширяющимися подстановочными знаками, и это еще один пример ортогонального дизайна.

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

При запуске в каталоге modules какая команда ls выдаст этот результат?

ethane.pdb methane.pdb

  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. показывает только файлы, начинающиеся с 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│ ├── калибровка│ └── наборы данных└── 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│ ├── калибровка│ │ ├── 2015-10-23  -calibration.txt│ │ ├── 2015-10-26-Calibration.txt│ │ └── 2015-11-23-Calibration.txt│ └── dataset ── 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/ калибровка $ cp 2015-11- * send_to_bob/all_november_files/$ cp * -23-dataset * send_to_bob/all_datasets_created_on_a_23rd/ 

Организация каталогов и файлов

Джейми работает над проектом и видит, что ее файлы не очень хорошо организованы:

  $ ls -F  

  проанализировано/фруктоза.dat raw/сахароза.  dat  

Файлы fructose.dat и sugarrose.dat содержат вывод из ее анализа данных. Какие команды, описанные в этом уроке, ей нужно запустить, чтобы приведенные ниже команды дали показанный результат?

  $ ls  -F  

  проанализировано/raw/ 

  Анализируется $ ls  

  фруктоза.dat сахароза.dat  

Решение

  Анализ mv * .dat  

Джейми нужно переместить свои файлы fructose.dat и sugarrose.dat в каталог analysis . Оболочка развернется * .dat для соответствия всем файлам .dat в текущем каталоге. Команда mv затем перемещает список файлов .dat в ‘проанализированный’ каталог.

Воспроизвести структуру папок

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

Предположим, что предыдущий эксперимент находится в папке с именем ‘2016-05-18’, которая содержит папку data который, в свою очередь, содержит папки с именами raw и processing , которые содержат файлы данных. Цель состоит в том, чтобы скопировать структуру папок из папки 2016-05-18-data в папку с именем 2016-05-20 , чтобы окончательная структура каталогов выглядит так:

  2016-05-20/└── данные ├── обработано └── raw   

Какой из следующего набора команд может достичь этой цели? Что будут делать другие команды?

  $ mkdir 2016-05-20 $ mkdir 2016-05-20/data $ mkdir 2016-05-20/data/processing $ mkdir 2016-05-20/data/raw  

  $ mkdir 2016-05-20 $ cd 2016-05-20 $ mkdir  data $ cd data $ mkdir raw обработано  

  $ mkdir 2016-05-  20/data/raw $ mkdir 2016-05-20/data/processing  

  $ mkdir -p 2016-05-20/data/raw $ mkdir -p 2016-05-20/data/processing  

  $ mkdir 2016-05-20 $ cd 2016-05-20 $ mkdir data $  mkdir raw обработано  

Решение

Первые два набора команд достигают этой цели. первый набор использует относительные пути для создания каталога верхнего уровня перед подкаталогами.

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

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

Последний набор команд создает каталоги «сырых» и «обработанных» на том же уровне, что и каталог «данных».

Ключевые моменты

  • cp [old] [new] копирует файл.

  • mkdir [path] создает новый каталог.

  • mv [old] [new] перемещает (переименовывает) файл или каталог.

  • rm [path] удаляет (удаляет) файл.

  • * соответствует нулю или более символов в имени файла, поэтому *. txt соответствует всем файлам, оканчивающимся на .txt.

  • ? соответствует любому одиночному символу в имени файла, поэтому ?. txt соответствует a.txt , но не any.txt код>.

  • Использование клавиши Control можно описать разными способами, включая Ctrl-X , Control-X и ^ X .

  • В оболочке нет корзины для мусора: как только что-то удалено, оно действительно исчезает.

  • Большинство файлов имеют имена something.extension . Расширение не требуется и ничего не гарантирует, но обычно используется для указания типа данных в файле..

  • В зависимости от типа выполняемой работы вам может потребоваться более мощный текстовый редактор, чем Nano.

Оцените статью
clickpad.ru
Добавить комментарий