Определить, какие из заданных имен файлов удовлетворяют маске hello c

Обновлено: 06.07.2024

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

12 ответов 12

Чтобы завершить существующие ответы:

Утилита списка каталогов по умолчанию ls может использоваться в сочетании с подстановочными знаками оболочки. Чтобы найти все файлы с шаблоном abc :

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

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

В этом случае само дерево поддерживает подстановочные знаки.

Почему, когда я выполняю команду ls -l B*, отображается содержимое всех каталогов, начинающихся с буквы B, а не только имена соответствующих каталогов?

@ErikE Потому что, когда вы просите ls указать каталог, он открывает его, это то же самое, что и ls -l BirthdayPhotos . Вы можете подавить это поведение с помощью ls -d B* .

@ErikE Поскольку использование файлового шаблона B* расширяется, чтобы соответствовать всем каталогам, начинающимся с B, поэтому вы действительно передаете ls список каталогов, поэтому он открывает их все для вас.

Не отвечает на вопрос. ls -d ABC* было тем, о чем спрашивал автор. Также комментарии во фрагменте кода неверны, ls abc* перечисляет содержимое каталогов, начинающихся с abc.

Вы можете использовать команду find для поиска файлов по шаблону

Приведенная выше команда будет искать файл, начинающийся с abc, в текущем рабочем каталоге.

-name 'abc' отобразит файлы, которые точно совпадают. Например: азбука

Вы также можете использовать

опция с командой find для поиска имени файла по шаблону

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

<р>. и замените ABC своим текстом.

Чтобы понять команду, давайте немного разберем ее:

find выводит список всех файлов в текущем каталоге и его подкаталогах; используя только его, вы просто перечислите все, что там есть. Обратите внимание, что find выводит каждый файл или каталог, начинающийся с ./ , указывая, что их путь относится к текущему каталогу. Важно знать об этом, потому что это означает, что мы будем искать результаты, начинающиеся с ./ABC, а не только ABC.

Первая черта | перенаправляет вывод одной команды на другую, в этом случае вывод find перенаправляется на grep . Это называется трубопроводом.

grep берет вывод и фильтрует его, используя заданный шаблон, ^\./ABC .

  • Обратите внимание, что шаблон заключен в одинарные кавычки ' ', чтобы оболочка не интерпретировала специальные символы внутри него.

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

Для нашей цели:

^ в регулярном выражении соответствует началу строки; это предотвращает сопоставление шаблона, если он не встречается в начале имени файла.

<р>. в регулярном выражении также имеет особое значение: оно означает «соответствовать любому отдельному символу здесь». Если вы хотите использовать его как буквальную точку, вам придется «экранировать» его, используя обратную косую черту \ перед ним. (Да, сопоставление любого символа в нашем случае было бы безвредно, но я сделал это для полноты картины.)

Привет, AM. Что ж, большая новость из Сиэтла заключается в том, что Моряки уволили своего генерального менеджера Билла Баваси; этого и следовало ожидать, когда вы тратите 117 миллионов долларов на зарплату, а команда, которую вы собрали, — с комфортным отрывом — худшая в бейсболе. Билл Баваси кажется достаточно приятным парнем, и он, без сомнения, много знает о бейсболе; однако по какой-то причине все, что он пробовал, заканчивалось тем, что сгорало. Например, два года назад Джефф Уивер был героем после окончания сезона в «Сент-Луис Кардиналс». Баваси и «Моряки» сразу же подписали с Уивером контракт на 8,35 миллиона долларов в год, и питчер в ответ выиграл целых 8 игр.

В прошлом году, полагая, что Карлос Силва наконец-то реализовал свой потенциал, "Моряки" подписали с ним 4-летний контракт на 48 миллионов долларов. В настоящее время у Карлоса рекорд 3-8, и в его самой запоминающейся игре (свидетелем которой лично стал сценарист, который пишет эту колонку) ему удалось вывести двух Детройтских тигров, прежде чем ему пришлось уйти в первом иннинге. (Почему он должен был уйти в первом иннинге? Превосходит нас, хотя тот факт, что он уже отказался от 7 ранов при 7 попаданиях, мог быть как-то связан с этим.)

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

Примечание. Конечно, конечно мы это проверили; мы бы не просто поверили ей на слово в чем-то подобном. Как оказалось, средний редактор зарабатывает около 50 000 долларов в год. Однако, как быстро заметил редактор сценариев, она совсем не но обычный редактор. И, судя по всему, несредние редакторы обычно зарабатывают около 12 млн долларов в год.

Это самые самые важные новости из Сиэтла. Какая вторая по величине новость циркулирует в районе Сиэтла в эти дни? Это должен быть новый скрипт Scripting Guys, который может применять «маску файла» при переименовании файлов. Знаете, этот скрипт:

Попробуем разобраться, что здесь происходит. Если вы какое-то время не использовали DOS, следует начать с указания на то, что команда ren ??x. р?.* ?а. до н.э.х?? просто означает это:

Найдите файл, в котором третий символ — x, а седьмой — p. Нам все равно, какие другие персонажи; на самом деле вопросительный знак (?) — это просто подстановочный знак для «любого символа». Нам также все равно, какое у файла расширение или сколько символов может содержать это расширение файла; поэтому мы используем звездочку (*) для обозначения расширения файла.

Если мы находим файл, отвечающий вышеуказанным критериям, мы хотим переименовать этот файл; для этого и нужна команда ren. И какое новое имя мы хотим дать этому файлу? Итак, мы хотим оставить символы 1, 3, 4, 5 и 6 в имени файла такими, какие они есть; кроме того, мы хотим сделать второй символ в имени a, седьмой символ b и восьмой символ a c. О, и мы хотим, чтобы первым символом в расширении файла был x, а второй и третий символы в расширении оставались как есть.

Примечание. Технически эта команда означает еще одну вещь: она будет искать файлы, в имени которых ровно восемь символов. Наш скрипт не проверяет количество символов в имени файла, но если вы хотите сделать это, не стесняйтесь. Почему мы не включили это? Ну, это добавило бы некоторую сложность сценарию, в котором мы не думали, что это необходимо. Это, а также тот факт, что мы боялись проверять количество слов в еженедельном редакторе скриптов: 12 миллионов долларов не так много, знаете ли.

Что все это значит? Хороший вопрос. Предположим, у нас есть такое имя файла, которое соответствует нашим критериям именования:

После того, как мы запустим наш скрипт, этот файл теперь должен называться так:

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

Повезло им, да?

Итак, как мы на самом деле выполняем это дикое и сумасшедшее переименование файлов? Ну для начала подключаемся к сервису WMI на локальном компьютере. И почему мы используем WMI для переименования наших файлов? Правильно: потому что это позволяет нам использовать тот же скрипт для переименования файлов на удаленном компьютере. На самом деле, все, что нам нужно сделать, это присвоить имя этого удаленного компьютера переменной strComputer, например так:

Примечание. Скажите, значит ли это, что вы действительно уделяли нам внимание все эти годы? Нет, не трудитесь отвечать; мы просто притворимся, что это так.

Наш следующий шаг — использовать следующий запрос Associators Of для получения коллекции всех файлов, найденных в папке C:\Scripts:

Это хороший вопрос: вместо того, чтобы возвращать коллекцию всех файлов в папке C:\Scripts, нельзя ли написать запрос, возвращающий только те файлы, которые соответствуют нашим критериям? И ответ на это таков: возможно. Однако мы были обеспокоены тем, что такой запрос (при условии, что мы могли его написать) будет излишне сложным. Вдобавок ко всему, такой подход не позволит никому, кто работает под управлением Windows 2000, использовать сценарий; это связано с тем, что вы не можете использовать запросы с подстановочными знаками WMI в любой версии Windows до Windows XP. Помня об этом, мы решили получить все файлы, а затем изучить каждый по отдельности, проверяя, соответствует ли имя нашим критериям.

На самом деле, именно это мы и делаем дальше: мы настраиваем цикл For Next, чтобы перебирать коллекцию файлов. Внутри этого цикла первое, что мы делаем, это берем значения свойств FileName и Extension и присваиваем их переменным strName и strExtension:

После этого пришло время проверить, соответствует ли имя файла нашим критериям выбора.Мы могли бы использовать регулярное выражение, чтобы определить, проходит ли тест каждое имя файла; однако мы решили, что, поскольку у нас есть только два простых критерия, которые должны быть соблюдены (третья буква — x, седьмая буква — p), мы могли бы сделать это намного проще, используя оператор If Then:

Видишь? Мы говорили вам, что это было легко. Все, что мы делаем, это используем функцию Mid для проверки двух вещей: 1) равен ли третий символ в переменной strName x? и 2) равен ли седьмой символ в strName p? Если какая-либо из этих проверок неверна, то имя нашего файла не соответствует нашему тесту; следовательно, мы возвращаемся к началу цикла и повторяем попытку со следующим файлом в коллекции. Но что, если обе проверки вернут True? Что ж, в таком случае нам нужно переименовать файл.

С этой целью первое, что мы делаем, — присваиваем переменной с именем strNewName пустую строку; как следует из названия, мы собираемся использовать эту переменную для хранения нашего нового имени файла:

Затем мы настраиваем цикл For Next, который начинается с 1 (представляет первый символ в строке strName) и продолжается до тех пор, пока не будет достигнут последний символ в строке strName, что мы можем определить с помощью функции Len:

Первое, что мы делаем в этом цикле For Next, — это устанавливаем оператор Select Case, который выполняет действие на основе значения переменной-счетчика i. Какие действия собирается предпринять Select Case? Излишне говорить, что это будет зависеть от значения i. Например, при первом прохождении цикла i будет равно 1. В первом символе имени файла нет ничего особенного; как вы помните, мы хотим оставить первый символ таким, какой он есть. Поэтому мы выполняем часть Case Else нашего оператора Select Case:

Что мы здесь делаем? Вы поняли: мы просто добавляем текущий символ имени файла (например, символ i) к переменной strNewName. Если имя нашего файла 12x456p7.abc, это означает, что после того, как мы завершим наш первый проход по циклу, strNewName будет равно этому:

Во второй раз становится немного интереснее. Почему? Потому что мы не хотим использовать второй символ в имени файла; вместо этого мы хотим заменить этот символ (каким бы он ни был) на букву a. Вот почему мы выполняем эту строку кода:

Другими словами, если наша переменная-счетчик равна 2, мы хотим добавить букву a к строке strNewName, отбрасывая любой символ, который в данный момент является вторым символом в имени файла.

К тому времени, как мы закончим, весь цикл strNewName должен выглядеть так:

Наша следующая задача — изменить расширение файла. Как оказалось, это легко; в конце концов, новое расширение файла — это просто буква x, за которой следуют второй и третий символы в существующем расширении файла. Это означает, что мы можем создать новое расширение файла с помощью одной строки кода:

Примечание. На самом деле мы могли создать новое имя файла, используя одну строку кода; мы использовали оператор Select Case просто потому, что думали, что людям будет легче следовать логике того, что мы делаем. (Ну, если предположить, что во всем, что делают сценаристы, есть какая-то логика.) Если вам не нравится печатать, и если вы просто ненавидите операторы Select Case, что ж, , эта строка кода сделает свое дело:

Все, что нам нужно сделать сейчас, это построить полный путь к файлу; это связано с тем, что метод Rename WMI требует, чтобы мы передавали полный путь к файлу, а не просто новое имя файла. Давайте сами разберетесь, для чего нужна эта строка кода (подсказка: она предназначена для построения полного пути к файлу):

И как только это будет сделано, переименовать файл будет просто, вызвав метод Rename:

Оттуда мы возвращаемся к началу цикла, где повторяем процесс со следующим файлом в коллекции. Когда все сказано и сделано – на этот раз мы покажем, чтобы вы сами увидели, что происходит, когда все сказано и сделано. (Подсказка: все файлы, соответствующие критериям, будут переименованы в соответствии с нашим новым соглашением об именах.)

И это вторая по величине новость в районе Сиэтла. Кстати, следует уточнить, что мы не знаем наверняка, что редактор сценариев зарабатывает 12 миллионов долларов в год; Microsoft не любит, когда сотрудники рассказывают другим людям, сколько они зарабатывают каждый год. Все, что нам на самом деле известно, это то, что Редактор сценариев водит Lexus. Конечно, это Lexus, который почему-то пахнет скипидаром. О, и сейчас горит лампочка Check Engine, а из багажника течет вода, как через решето. Но эй, это все еще Lexus, и даже у такого роскошного автомобиля время от времени возникают проблемы, верно?

Примечание. Значит, редактор сценария использует свою машину для контрабанды контрабандного скипидара через границу между Вашингтоном и Орегоном? Это слух, и мы склонны полагать, что в этом слухе может быть что-то в.В конце концов, вы не можете ожидать, что человек с таким образом жизни, как редактор сценариев, проживет на жалкие 12 миллионов долларов в год, не так ли?

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

Регулярные выражения в Perl

Регулярное выражение (или Регулярное выражение) — это шаблон (или фильтр), описывающий набор строки, соответствующие шаблону. Другими словами, регулярное выражение принимает определенный набор строк и отклоняет остальные.

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

  • "Сводка синтаксиса регулярных выражений" для сводки синтаксиса регулярных выражений и примеров.
  • "Регулярные выражения" для полного охвата.

Perl широко использует регулярные выражения со множеством встроенных синтаксисов и операторов. В Perl (и JavaScript) регулярное выражение отделяется парой косых черт (по умолчанию) в форме /regex/ . Вы можете использовать встроенные операторы:

  • m/регулярное выражение/модификатор : соответствует регулярному выражению .
  • s/regex/replacement/modifier : заменить совпавшие подстроки заменой.

Оператор сопоставления m//

Вы можете использовать оператор сопоставления m//, чтобы проверить, существует ли в строке шаблон регулярного выражения. Синтаксис:

Разделитель

Вместо косой черты ( / ) в качестве разделителя можно использовать другие символы, не являющиеся буквенно-цифровыми, например ! , @ и % в виде m!regex!modifiers m@regex@modifiers или m%< em>regex%модификаторы . Однако, если в качестве разделителя используется косая черта ( / ), оператор m можно опустить в форме /regex/modifiers . Изменение разделителя по умолчанию сбивает с толку и не рекомендуется.

m// по умолчанию работает с переменной по умолчанию $_ . Возвращает true, если $_ соответствует регулярному выражению; и false в противном случае.

Пример 1: регулярное выражение 7+
Пример 2. Извлечение совпадающих подстрок

Встроенные переменные массива @- и @+ сохраняют начальную и конечную позиции совпадающей подстроки, где $-[0] и $+[0] для полного совпадения, а $-[n] и $ +[n] для обратных ссылок $1, $2, . $n , .

Пример 3: Модификатор 'g' (глобальный)

По умолчанию m// находит только первое совпадение. Чтобы найти все совпадения, включите модификатор 'g' (глобальный).

Операторы =~ и !~

По умолчанию операторы сопоставления работают с переменной по умолчанию $_ . Чтобы работать с другой переменной вместо $_ , вы можете использовать операторы =~ и !~ следующим образом:

При использовании с m// =~ ведет себя как сравнение ( == или eq ).

Пример 4: оператор =~

Оператор подстановки s///

Вы можете заменить строку (или часть строки) другой строкой, используя оператор подстановки s///. Синтаксис:

Подобно m// , s/// по умолчанию работает с переменной по умолчанию $_. Для работы с другой переменной вы можете использовать операторы =~ и !~. При использовании с s/// =~ ведет себя как присваивание ( = ).

Пример 5: s///

Модификаторы

Модификаторы (например, /g , /i , /e , /o , /s и /x ) можно использовать для управления поведением m// и s/// .< /p>

  • g (глобальный): по умолчанию обрабатывается только первое вхождение совпадающей строки каждой строки. Вы можете использовать модификатор /g, чтобы указать глобальную операцию.
  • i (без учета регистра): по умолчанию при сопоставлении учитывается регистр. Вы можете использовать модификатор /i, чтобы включить сопоставление без учета регистра.
  • m (многострочный): многострочная строка, влияющая на привязку позиции ^ , $ , \A , \Z .
  • s: разрешает метасимвол. (точка) для соответствия новой строке.

Обратные ссылки и совпадающие переменные в скобках $1 , . $9

Скобки ( ) в регулярных выражениях служат двум целям:

  1. Во-первых, круглые скобки ( ) можно использовать для группировки подвыражений для переопределения приоритета или применения оператора повторения. Например, /(a|e|i|o|u)/ совпадает с /a|e|i|o|u/ .
  2. Во-вторых, круглые скобки используются для предоставления так называемых обратных ссылок. Обратная ссылка содержит совпадающую подстроку. Например, регулярное выражение /(\S+)/ создает одну обратную ссылку (\S+) , содержащую первое слово (не пробелы подряд) во входной строке; регулярное выражение /(\S+)\s+(\S+)/ создает две обратные ссылки: (\S+) и еще одну (\S+) , содержащую первые два слова, разделенные одним или несколькими пробелами \s+ .

Обратные ссылки хранятся в специальных переменных $1 , $2 , …, $9 , где $1 содержит подстроку, совпадающую с первой парой круглых скобок, и так далее. Например, /(\S+)\s+(\S+)/ создает две обратные ссылки, соответствующие первым двум словам. Совпадающие слова сохраняются в $1 и $2 соответственно.

Например, следующее выражение меняет местами первое и второе слова:

На обратные ссылки также можно ссылаться в вашей программе.

Скобки создают одну обратную ссылку, которая соответствует первому слову $str, если оно есть, и помещаются внутрь скалярной переменной $word . Если совпадений нет, $word равен UNDEF .

Две пары скобок помещают первые два слова (разделенные одним или несколькими пробелами) строки $str в переменные $word1 и $word2, если слов больше двух; в противном случае и $word1, и $word2 имеют значение UNDEF. Обратите внимание, что сопоставление с регулярным выражением должно быть полным, а частичное совпадение исключено.

\1 , \2 , \3 имеет то же значение, что и $1 , $2 , $3 , но допустимы только внутри s/// или m// . Например, /(\S+)\s\1/ соответствует паре повторяющихся слов, разделенных пробелом.

Оператор перевода символов tr///

Вы можете использовать оператор-переводчик для перевода одного символа в другой. Синтаксис:

заменяет или переводит fromchars в tochars в $_ и возвращает количество замененных символов.

Вместо косой черты ( / ) вы можете использовать круглые скобки () , квадратные скобки [] , фигурную скобку <> в качестве разделителя, например,

Если tochars короче, чем fromchars , повторно используется последний символ tochars.

tr/// возвращает количество замененных символов. Вы можете использовать его для подсчета появления определенных символов. Например,

Модификаторы /c , /d и /s для tr///
  • /c : дополняет (инверсирует) fromchars .
  • /d : удаляет все совпадающие, но не замененные символы.
  • /s : сжимает повторяющиеся символы в один.

Строковые функции: разделение и объединение

split(regex, str, [numItems]): разбивает заданную str с помощью regex и возвращает элементы в массиве. Необязательный третий параметр указывает максимальное количество обрабатываемых элементов.

join(joinStr, strList) : объединяет элементы в strList с заданным joinStr (возможно, пустым). ).

Функции grep , map

  • grep(regex, array) : выбирает те элементы массива , которые соответствуют regex .< /li>
  • map(regex, array) : возвращает новый массив, созданный путем применения regex к каждому элементу массива .

Ввод/вывод файла

Файловый дескриптор

Файловые дескрипторы — это структуры данных, которые ваша программа может использовать для управления файлами. дескриптор файла действует как ворота между вашей программой и файлами, каталогами или другими программами< /эм>. Ваша программа сначала открывает ворота, затем отправляет или получает данные через ворота и, наконец, закрывает ворота. Есть много типов ворот: односторонние и двусторонние, медленные и быстрые, широкие и узкие.

Соглашение об именах: используйте прописные буквы для имени дескриптора файла, например, FILE , DIR , FILEIN , FILEOUT и т. д.

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

Пример. Чтение и печать содержимого текстового файла с помощью дескриптора файла.

Пример: поиск и печать строк, содержащих определенное слово для поиска.

Пример. Печать содержимого каталога с помощью дескриптора каталога.

Вы можете использовать функцию printf C-style для форматированного вывода в файл.

Функции обработки файлов

Функция open : open(дескриптор файла, строка) открывает имя файла, заданное string, и связывает его с дескриптором файла. эм> . Возвращает true в случае успеха и UNDEF в противном случае.

  • Если строка начинается с < (или ничего), она открывается для чтения.
  • Если строка начинается с > , она открывается для записи.
  • Если строка начинается с >> , она открывается для добавления.
  • Если строка начинается с + < , +>, +>> , она открыта как для чтения, так и для записи.
  • Если string равно - , открывается STDIN.
  • Если string >- , открывается STDOUT.
  • Если строка начинается с -| или |- , ваш процесс вызовет fork() для выполнения команды канала.

Функция close : close(дескриптор файла) закрывает файл, связанный с дескриптором файла . Когда программа завершается, Perl закрывает все открытые файловые дескрипторы. Закрытие файла сбрасывает буфер вывода в файл. Вам нужно только явно закрыть файл в случае, если пользователь прервет программу, чтобы обеспечить целостность данных.

Общая процедура изменения файла заключается в следующем:

  1. Чтение всего файла с помощью open(FILE, $filename) и @lines = .
  2. Закройте дескриптор файла.
  3. Работать с @lines (находящимся в быстром ОЗУ), а не с ФАЙЛОМ (находящимся на медленном диске).
  4. Запишите новое содержимое файла с помощью open(FILE, «>$filename») и напечатайте FILE @lines .
  5. Закройте дескриптор файла.

Пример: прочитать содержимое всего файла в память; изменять и записывать обратно на диск.

Пример: чтение из файла

Пример: запись в файл

Пример: добавление к файлу

Редактирование на месте

Вместо того, чтобы читать один файл и записывать в другой файл, вы можете выполнять редактирование на месте, указав флаг –i или используя специальную переменную $^I .

  • Флаг –ibackupExtension указывает Perl редактировать файлы на месте. Если указано backupExtension, файл резервной копии будет создан с backupExtension .
  • Специальная переменная $^I=backupExtension делает то же самое.

Пример: редактирование на месте с использованием флага –i

Пример: редактирование на месте с использованием специальной переменной $^I.

Функции поиска, сообщения, усечения

seek(дескриптор файла, позиция, откуда): перемещает указатель файла дескриптора файла в позиция , измеряемая от откуда . seek() возвращает 1 в случае успеха и 0 в противном случае. Положение файла измеряется в байтах. откуда 0 отсчитывается от начала файла; 1 измеряется от текущего положения; и 2 измеряется от конца. Например:

tell(filehandle) : возвращает текущую позицию в файле filehandle .

truncate(FILE, length) : усекает FILE до length байт. FILE может быть либо дескриптором файла, либо именем файла.

Чтобы узнать длину файла, вы можете:

Пример: усекать последние 2 байта, если они начинаются с \x0D,

Функция

eof(дескриптор файла) возвращает 1, если указатель файла находится в конце файла или если дескриптор файла не открыт.

Чтение байтов вместо строк

Функция read(дескриптор файла, var, length, смещение) считывает length байты из дескриптора файла, начиная с текущего указателя файла, и сохраняются в переменной var, начиная с смещения (если опущено, по умолчанию равно 0). Байты включают \x0A , \x0D и т. д.

Пример

Передача данных в процесс и из него

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

  • open(handle, "command|") позволяет читать результаты command .
  • open(handle, "|command") позволяет писать на вход command .

Оба этих оператора возвращают идентификатор процесса (PID) команды .

Пример. Команда dir выводит текущий каталог. Открыв канал из каталога, вы можете получить доступ к его выходным данным.

Пример . В этом примере показано, как можно направить ввод в программу sendmail.

Вы не можете одновременно передавать данные в команду и из нее. Если вы хотите прочитать вывод команды, который вы открыли с помощью |команды , отправьте вывод в файл. Например,

Удаление файла: функция отмены связи

unlink(FILES) удаляет FILES, возвращая количество удаленных файлов. Не используйте unlink() для удаления каталога, вместо этого используйте rmdir(). Например,

Проверка файлов

  • -e : существует.
  • -f : обычный файл.
  • -d : каталог.
  • -T : похоже, это текстовый файл (данные от 0 до 127).
  • -B : похоже, это двоичный файл (данные от 0 до 255).
  • -r : читаемый.
  • -w : доступно для записи.
  • -x : исполняемый файл.
  • -s : возвращает размер файла в байтах.
  • -z : пустой (нулевой байт).
Пример

Статистика функций и lsstat

Функция stat(FILE) возвращает массив из 13 элементов, содержащий основные статистические данные FILE . lsstat(SYMLINK) возвращает то же самое для символической ссылки SYMLINK .

Индекс Значение
0 Устройство
1 Инод файла
2 Режим файла
3 Количество жестких ссылок на файл
4 Идентификатор пользователя владельца файла
5 Идентификатор группы файла
6 Необработанное устройство
7 Размер файла
8 Время последнего доступа
9 Время последнего изменения
10 Время последнего изменения статуса файла
11 Размер блока system
12 Количество блоков, используемых файлом

Например: команда

выводит размер файла " test.txt ".

Доступ к каталогам

  • opendir(DIRHANDLE, имя_каталога) открывает каталог имя_каталога .
  • closedir(DIRHANDLE) закрывает дескриптор каталога.
  • readdir(DIRHANDLE) возвращает следующий файл из DIRHANDLE в скалярном контексте или остальные файлы в контексте массива.
  • glob(string) возвращает массив имен файлов, соответствующих подстановочному знаку в string , например, glob('*.dat') и glob('test.txt' ).
  • mkdir(имя_каталога, режим) создает каталог имя_каталога с защитой, заданной режимом .
  • rmdir(dirname) удаляет каталог dirname , только если он пуст.
  • chdir(имя_каталога) изменяет рабочий каталог на имя_каталога .
  • chroot(имя_каталога) делает имя_каталога корневым каталогом "/" для текущего процесса, используемым только суперпользователем.

Пример: распечатать содержимое заданного каталога.

Пример: удаление пустых файлов в заданном каталоге

Пример: Отображаемые файлы соответствуют " *.txt "

Пример. Отображаемые файлы соответствуют шаблону командной строки.

Стандартные дескрипторы файлов

Perl определяет следующие стандартные дескрипторы файлов:

  • STDIN — стандартный ввод, обычно относится к клавиатуре.
  • STDOUT – стандартный вывод, обычно относящийся к консоли.
  • STDERR — стандартная ошибка, обычно относится к консоли.
  • ARGV — аргументы командной строки.

Когда вы используете пустые угловые скобки <> для получения входных данных от пользователя, используется дескриптор файла STDIN; когда вы получаете входные данные из командной строки, он использует дескриптор файла ARGV. Perl автоматически заполняет STDIN или ARGV. Всякий раз, когда вы используете функцию print(), она использует файловый обработчик STDOUT.

<> ведет себя так, как если бы еще были данные для чтения из файлов командной строки, и ведет себя как в противном случае.

Форматирование текста

Запись функции

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

Объявление формата

Поле изображения @
  • @ < : стирает строку влево на следующей строке текста форматирования.
  • @> : стирает строку справа на следующей строке текста форматирования.
  • @| : центрирует строку на следующей строке текста форматирования.

Печать строки форматирования printf

printf(дескриптор файла, шаблон, массив) : печатает отформатированную строку в дескриптор файла (аналогично fprintf()). Например,

Я ищу строку foo= в текстовых файлах в дереве каталогов. Это на обычной машине с Linux, у меня есть оболочка bash:

В каталогах также много двоичных файлов, которые соответствуют "foo=" . Поскольку эти результаты не имеют значения и замедляют поиск, я хочу, чтобы grep пропустил поиск этих файлов (в основном изображений JPEG и PNG). Как мне это сделать?

Я знаю, что существуют параметры --exclude=ШАБЛОН и --include=ШАБЛОН, но каков формат шаблона? На справочной странице grep говорится:

Поиск по grep include, grep include exclude, grep exclude и вариантам не нашел ничего подходящего

Если есть лучший способ поиска только в определенных файлах, я полностью за него; перемещение оскорбительных файлов не вариант. Я не могу искать только в определенных каталогах (структура каталогов - большой беспорядок, везде есть все). Кроме того, я не могу ничего установить, поэтому мне приходится использовать общие инструменты (такие как grep или предложенный find).

К вашему сведению, используемые аргументы: -c подсчитывать совпадения в файле -i без учета регистра -l показывать только совпадающие файлы -r рекурсивно

22 ответа 22

Синтаксис --exclude идентичен.

Обратите внимание, что перед звездочкой стоит обратная косая черта, чтобы предотвратить ее расширение оболочкой (так же будет работать и ее цитирование, например --include="*.cpp" ). В противном случае, если у вас есть файлы в текущем рабочем каталоге, которые соответствуют шаблону, командная строка расширится до чего-то вроде grep pattern -r --include=foo.cpp --include=bar.cpp rootdir , который будет искать только файлы с именами foo.cpp и bar.cpp , что, скорее всего, не то, что вам нужно.

Обновление от 04.03.2021

Я отредактировал исходный ответ, убрав использование расширения фигурных скобок, которое является функцией, предоставляемой несколькими оболочками, такими как Bash и zsh, для упрощения подобных шаблонов; но обратите внимание, что раскрытие фигурных скобок несовместимо с оболочкой POSIX.

Исходный пример был таким:

для поиска по всем файлам .cpp и .h, расположенным в корневом каталоге каталога rootdir .

Не знаю почему, но мне пришлось процитировать шаблон включения следующим образом: grep pattern -r --include="*." rootdir

@topek: Хорошо, если у вас есть файлы .cpp/.h в вашем текущем каталоге, то оболочка расширит glob перед вызовом grep, так что вы получите командную строку вида grep pattern -r --include=foo.cpp --include=bar.h rootdir , которая будет искать только файлы с именами foo.cpp или bar.h . Если в текущем каталоге нет файлов, соответствующих глобусу, оболочка передает глобус в grep, который правильно его интерпретирует.

Я только что понял, что глобус используется только для сопоставления имени файла. Чтобы исключить весь каталог, нужна опция --exclude-dir. Однако применяются те же правила. Совпадает только имя файла каталога, а не путь.

--include не работает после --exclude . Я полагаю, что нет смысла даже пытаться, за исключением того, что у меня есть псевдоним для grep с длинным списком --exclude и --exclude-dir , который я использую для поиска кода, игнорирования библиотек и файлов подкачки и прочего. Я надеялся, что grep -r --exclude='*.foo' --include='*.bar' сработает, поэтому я мог ограничить свой псевдоним только --include='*.bar', но это кажется, игнорирует --include и включает все, что не является файлом .foo. Поменять местами --include и --exclude работает, но, увы, с моим псевдонимом это бесполезно.

как мы можем читать чьи-то мысли, чтобы получить правила для этого ШАБЛОНА . Полчаса не могу найти описания чего они там ждут

Если вы просто хотите пропустить двоичные файлы, я предлагаю вам обратить внимание на параметр -I (верхний регистр i). Он игнорирует двоичные файлы. Я регулярно использую следующую команду:

Он ищет рекурсивно, игнорирует двоичные файлы и не просматривает скрытые папки Subversion по любому шаблону, который я хочу. У меня на работе псевдоним "grepsvn".

Что делать, если --exclude-dir недоступен? Во всех моих попытках --exclude не подходит.

Вы всегда можете загрузить последний исходный код grep с сайта GNU и выполнить 'configure; сделать; sudo сделать установить». Это одна из первых вещей, которые я делаю на Mac или более старых дистрибутивах Linux.

Пожалуйста, взгляните на ack, который предназначен именно для таких ситуаций. Ваш пример

Вы также можете установить переменную среды: GREP_OPTIONS="--exclude-dir=\.svn"

Однако я поддержу голос Энди за подтверждение, это лучшее решение.

+1 за указание точного номера версии; У меня grep 2.5.1 и опция exclude-dir недоступна

Я нашел это спустя долгое время, вы можете добавить несколько включений и исключений, например:

Предлагаемая команда:

концептуально неверно, потому что --exclude работает с базовым именем. Другими словами, он пропустит только .svn в текущем каталоге.

В grep 2.5.1 вы должны добавить эту строку в профиль ~/.bashrc или ~/.bash

Я считаю, что результаты grepping grep иногда очень полезны:

Хотя это на самом деле не мешает ему искать двоичные файлы.

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

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

Во второй и третьей строках используйте "*.jpg", "*.jpg", "*.jpg" и т. д. Используйте столько конструкций -o -name ". " -prune, сколько шаблонов у вас есть.

В 4-й строке вам нужен еще один -o (он указывает "или" для поиска ), шаблоны, которые вам ДЕЙСТВИТЕЛЬНО нужны, и вам нужен либо -print, либо -print0 в конце. Если вы просто хотите «все остальное», что осталось после обрезки изображений *.jpg , *.jpg и т. д., используйте -o -print0, и все готово с 4-й строкой.

Наконец, в 5-й строке находится канал для xargs, который берет каждый из полученных файлов и сохраняет их в переменной FILENAME . Затем он передает grep флаги -IR, «шаблон», а затем FILENAME расширяется с помощью xargs, чтобы стать тем списком имен файлов, которые были найдены find .

В этом документе перечислены команды для создания, копирования, переименования и удаления файлов и каталогов Unix. Предполагается, что вы используете Unix в службе входа в систему ITS (login.itd.umich.edu). Приведенные здесь инструкции применимы ко многим другим машинам Unix; однако вы можете заметить другое поведение, если вы не используете службу входа в ITS.

Что такое файлы и каталоги Unix?

Файл — это «контейнер» для данных. Unix не делает различий между типами файлов — файл может содержать текст документа, данные для программы или саму программу.

Каталоги позволяют упорядочивать файлы, позволяя группировать связанные файлы вместе. Каталоги могут содержать файлы и/или другие каталоги. Каталоги аналогичны папкам Macintosh и Windows.

Именование файлов и каталогов Unix

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

Имена файлов и каталогов могут содержать до 256 символов.Имена могут использовать практически любой символ (кроме пробела). Вы можете разделить имя файла, состоящее из нескольких слов, с помощью символа подчеркивания или точки (например, Chapter_one или Chapter.two).

Некоторые символы имеют особое значение для Unix. Лучше избегать использования этих символов в именах файлов:

Unix чувствителен к регистру. Каждый из них является уникальным файлом: myfile, Myfile, myFile и MYFILE.

Создание файла

Многие люди создают файлы с помощью текстового редактора, но вы можете использовать команду cat для создания файлов без использования или обучения использованию текстового редактора. Чтобы создать учебный файл (называемый firstfile) и ввести в него одну строку текста, введите в командной строке % следующее:

Завершите ввод файла, нажав Control-d в отдельной строке. (Удерживая нажатой клавишу Control, введите d.) На экране вы увидите:

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

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

Чтобы создать дубликат файла, используйте команду cp. Например, чтобы создать точную копию файла с именем firstfile, введите:

В результате появляются два файла с разными именами, каждый из которых содержит одинаковую информацию. Команда cp перезаписывает информацию. Если вы создадите другой файл с именем ThirdFile, а затем введите следующую команду:

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

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

В Unix нет специальной команды для переименования файлов. Вместо этого команда mv используется как для изменения имени файла, так и для перемещения файла в другой каталог.

Чтобы изменить имя файла, используйте следующий формат команды (где Thirdfile и file3 — примеры имен файлов):

Эта команда приводит к полному удалению третьего файла, но новый файл с именем файл3 содержит предыдущее содержимое третьего файла.

Как и cp, команда mv перезаписывает существующие файлы. Например, если у вас есть два файла, четвертый и второй, и вы вводите команду

mv удалит исходное содержимое второго файла и заменит его содержимым четвертого файла. В результате четвертый файл переименовывается во второй файл, но при этом второй файл удаляется.

Удаление файла

Используйте команду rm для удаления файла. Например,

удаляет файл3 и его содержимое. Вы можете удалить более одного файла за раз, указав список файлов, которые необходимо удалить. Например,

Вам будет предложено подтвердить, действительно ли вы хотите удалить файлы:

Введите y или yes, чтобы удалить файл; введите n или нет, чтобы оставить его без изменений.

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

Создание каталогов позволяет упорядочивать файлы. Команда

создает каталог с именем project1, где вы можете хранить файлы, относящиеся к конкретному проекту. Созданный вами каталог будет подкаталогом внутри вашего текущего каталога. Подробнее о навигации по каталогам и отображении содержащихся в них файлов и каталогов см. в разделе Список содержимого и навигация по каталогам Unix.

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

Команды mv и cp можно использовать для помещения файлов в каталог. Предположим, вы хотите поместить некоторые файлы из вашего текущего каталога во вновь созданный каталог с именем project1. Команда

переместит библиографию файлов в каталог project1. Команда

поместит копию файла Chapter1 в каталог Project1, но оставит Chapter1 нетронутым в текущем каталоге. Теперь будет две копии главы 1: одна в текущем каталоге, а другая в проекте 1.

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

Вы также можете использовать команду mv для переименования и перемещения каталогов. Когда вы вводите команду

каталог с именем проект1 получит новое имя проект2, если ранее каталог с именем проект2 не существовал. Если каталог project2 уже существовал до того, как была введена команда mv,

переместит каталог project1 и его файлы в каталог project2.

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

Вы можете использовать команду cp для создания копии каталога и его содержимого. Например, чтобы скопировать каталог project1 в каталог proj1copy, введите

Если каталог proj1copy уже существует, эта команда поместит копию каталога project1 в каталог proj1copy\.

Удаление каталога

Используйте команду rmdir, чтобы удалить пустой каталог. Несколько пустых каталогов можно удалить, перечислив их после команды:

Если вы попытаетесь удалить каталог, который не пуст, вы увидите

rmdir: testdir3: Каталог не пустой

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

Сводка команд

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

mv файл1 файл2
Переименовывает файл1 в файл2 (если файл2 существовал ранее, перезаписывает исходное содержимое файла2).

cp файл1 файл2
Копирует файл1 как файл2 (если файл2 существовал ранее, перезаписывает исходное содержимое файла2).

rm файл3 файл4
Удаляет файл3 и файл4, запрашивая подтверждение для каждого удаления.

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

mkdir dir1
Создает новый каталог с именем dir1.

mv dir1 dir2
Если dir2 не существует, переименовывает dir1 в dir2.
Если каталог dir2 существует, каталог dir1 перемещается внутрь каталога dir2.

cp -r dir1 dir2
Если dir2 не существует, копирует dir1 как dir2.
Если каталог dir2 существует, копирует dir1 внутрь dir2.

rmdir dir1
Удаляет dir1, если dir1 не содержит файлов.

rm -r dir1
Удаляет dir1 и все содержащиеся в нем файлы. Используйте с осторожностью.

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

cp file1 dir1
Копирует файл file1 в существующий каталог dir1.

mv file2 dir2
Перемещает файл file2 в существующий каталог dir2.

Читайте также: