Как вывести содержимое каталога с запятыми в качестве разделителя linux

Обновлено: 03.07.2024

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

Эта глава из книги

Эта глава из книги

Эта глава из книги 

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

Также я взял разделы по touch, mkdir, cp, mv, rm и rmdir и использовал их для создания новой главы 3 под названием «Сотворение и разрушение» (которая, конечно же, перенумеровала все после нее!). Наконец, раздел о su был перенесен в главу 8, «Власть и разрешения», что имеет гораздо больше смысла.

Список файлов и папок

Команда ls, вероятно, чаще всего используется людьми. В конце концов, прежде чем вы сможете манипулировать и использовать файлы в каталоге (помните, что файл и каталог взаимозаменяемы), вам сначала нужно узнать, какие файлы доступны. Вот тут-то и появляется ls, поскольку он перечисляет файлы и подкаталоги, найденные в каталоге.

Команда ls может показаться простой — просто покажите мне файлы! — но, как вы увидите, у этой удивительно гибкой команды есть удивительное количество комбинаций.

Набрав ls, вы увидите содержимое каталога, в котором вы сейчас работаете. Когда вы впервые войдете в свою оболочку, вы окажетесь в своем домашнем каталоге. Введите ls, и вы увидите примерно следующее:

Мы используем phpDocumentator для документирования нашего php-кода. Код php находится в разных словарях. Скрипт, запускающий phpDocumentator, выглядит так:

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

Я хотел бы сделать это динамически.

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

Вопрос:

Как я могу перечислить каталоги через запятую?

как добавить этот список в качестве параметра -d в сценарий phpdoc?



4 ответа 4

Используйте ls -dm */ для создания списка каталогов, разделенных запятыми. -d вернет только каталоги, а -m выведет список, разделенный запятыми.

Затем вы можете сохранить результат в переменной и передать его в качестве аргумента:


-d не ограничивает вывод ls каталогами; он просто не позволяет ls спускаться в каталоги.

Вот более простой способ поиска и вставки:

и то же самое, но с использованием абсолютных путей:

и версия с tr :

Вышеуказанное будет сканировать папки рекурсивно, если только вы не добавите -maxdepth 1, чтобы отобразить только один уровень глубины.

затем запустите phpdoc как:

++ только для действительно совпадающих каталогов (кроме символических ссылок на каталоги), но, пожалуйста, заключайте $PWD в двойные кавычки и не используйте имена переменных с заглавными буквами; придираюсь: если вы не добавите -mindepth 1 -maxdepth 1 , . также совпадает, как и любые дочерние каталоги и ниже.

Нет необходимости вызывать внешнюю программу (при условии, что это bash или ksh93):

Решение, включающее расширение для всех элементов массива, принадлежит @mklement0 (за исключением того, что нет необходимости экранировать /).


Элегантное решение для использования , в качестве разделителя, но ../*test* также потенциально может соответствовать файлам; простое исправление, гарантирующее соответствие только каталогам, заключается в использовании вместо этого ../*test*/. Однако это также добавляет трейлинг / ко всем совпадениям; если это неприемлемо, требуется дополнительная работа.

Спасибо за обновление. да, POSIX-подобные оболочки делают удивительно сложной фильтрацию по типу файловой системы. Однако удалить конечный / из результатов подстановки ../*test/ несложно: Bash позволяет выполнять замены всех элементов массива с помощью одного расширения параметра: phpdoc -d "$"

Мое удовольствие - это мощная функция, но ее не часто можно увидеть, и поэтому ее легко забыть (как и я, пока наш обмен не освежил мою память).Полезно знать, что экранирование / в этом случае необязательно, но стоит отметить, что оно необходимо для непустых замен / (в отличие от простого удаления ); например, var='12/'; echo "$" дает 12! , как и ожидалось, но var='12/'; echo "$" дает 12//!

@mklement0: \ не причинял никакого вреда, и есть повод сказать, что «если сомневаетесь, избегайте этого». Как общий разделитель по умолчанию, / часто экранируется, но мне пришлось ввести некоторый ввод :-)

В Unix-подобных операционных системах команда cut удаляет («вырезает») разделы каждой строки файла или файлов.

На этой странице представлена ​​версия cut для GNU/Linux.

Синтаксис

Параметры

-b, --bytes=LIST Выберите только байты из каждой строки, как указано в СПИСОК. LIST указывает байт, набор байтов или диапазон байтов; см. Указание LIST ниже.
-c, --characters=LIST Выбрать только символы из каждой строки, как указано в LIST. LIST указывает символ, набор символов или диапазон символов; см. Указание LIST ниже.
-d, --delimiter=DELIM Использовать символ DELIM вместо табуляции для разделителя полей.
-f, --fields=LIST Выберите только эти поля в каждой строке; также вывести любую строку, не содержащую символ-разделитель, если не указана опция -s. LIST указывает поле, набор полей или диапазон полей; см. раздел «Указание LIST» ниже.
-n Эта опция игнорируется, но включена из соображений совместимости.
--complement Дополнить набор выбранных байтов, символов или полей.
-s, - -only-delimited Не печатать строки, не содержащие разделителей.
--output-delimiter=STRING Используйте STRING в качестве выходной строки-разделителя. По умолчанию используется разделитель ввода.
--help Отображение справочного сообщения и выход.
--version Вывести информацию о версии и выйти.

Примечания по использованию

При вызове cut используйте опции -b, -c или -f, но только одну из них.

Если FILE не указан, cut читает из стандартного ввода.

Указание СПИСКА

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

N N-й байт, символ или поле, считая от 1.
N- От N-го байта, символа или поля до конца линия.
N-M От Nth до Mth байта, символа или поля (включительно).
-M От первого до M-го байта, символа или поля.

Например, предположим, что у вас есть файл с именем data.txt, который содержит следующий текст:

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

Чтобы "вырезать" только третье поле каждой строки, используйте команду:

<р>. который выводит следующее:

Если вместо этого вы хотите "вырезать" только второе-четвертое поле каждой строки, используйте команду:

<р>. который выводит следующее:

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

<р>. который выводит следующее:

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

<р>. который выводит следующее:

Указание диапазона с помощью LIST также применяется для вырезания символов (-c) или байтов (-b) из строки. Например, чтобы вывести только символы с третьего по двенадцатый каждой строки файла data.txt, используйте команду:

<р>. который выводит следующее:

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

В этом случае подсчет байтов вместо символов приводит к тому же результату, поскольку в текстовом файле с кодировкой ASCII каждый символ представлен одним байтом (восемь битов) данных. Итак, команда:

<р>. для нашего файла data.txt выдает тот же результат:

Указание разделителя, отличного от табуляции

Символ табуляции — это разделитель по умолчанию, который используется cut для определения того, что представляет собой поле. Таким образом, если поля вашего файла уже разделены символами табуляции, вам не нужно указывать другой символ-разделитель.

Однако в качестве разделителя можно указать любой символ. Например, файл /etc/passwd содержит информацию о каждом пользователе в системе, по одному пользователю в строке, и каждое информационное поле разделяется двоеточием (":"). Например, строка /etc/passwd для пользователя root может выглядеть так:

Эти поля содержат следующую информацию в следующем порядке, разделенную двоеточием:

  1. Имя пользователя
  2. Пароль (отображается как x, если он зашифрован)
  3. Идентификационный номер пользователя или UID
  4. Идентификационный номер группы или GID
  5. Поле комментария (используется командой finger)

Имя пользователя — это первое поле в строке, поэтому для отображения каждого имени пользователя в системе используйте команду:

<р>. который выводит, например:

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

Третье поле каждой строки в файле /etc/passwd — это UID (идентификационный номер пользователя), поэтому для отображения каждого имени пользователя и каждого идентификатора пользователя используйте команду:

<р>. который выводит, например, следующее:

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

Но что, если вы хотите, чтобы вывод был разделен табуляцией? Указание символа табуляции в командной строке немного сложнее, потому что это непечатаемый символ. Чтобы указать его в командной строке, вы должны «защитить» его от оболочки. Это делается по-разному в зависимости от того, какую оболочку вы используете, но в оболочке Linux по умолчанию (bash) вы можете указать символ табуляции с помощью $'\t'. Итак, команда:

<р>. выводит, например, следующее:

Примеры

Выведите третий символ каждой строки файла file.txt, опуская остальные.

Выведите первые три символа каждой строки файла file.txt, опуская остальные.

То же, что и в приведенной выше команде. Выведите первые три символа каждой строки файла file.txt.

Выведите символы с третьего по последний в каждой строке файла file.txt, опуская первые два символа.

Вывести первое поле файла /etc/passwd, где поля разделены двоеточием (':'). Первое поле /etc/passwd — это имя пользователя, поэтому эта команда выводит все имена пользователей в файле passwd.

Выведите первое и шестое поля, разделенные двоеточием, любой записи в файле /etc/passwd, в которой в качестве оболочки входа указан /bin/bash. Эта команда выводит имя пользователя и домашний каталог любого пользователя, чья оболочка входа — /bin/bash.

Связанные команды

grep — фильтровать текст, соответствующий регулярному выражению.
paste — объединять соответствующие строки файлов.

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

Основные форумы UNIX для начинающих. Вопросы и ответы Список всех файлов и каталогов в текущем каталоге, разделенных запятыми и отсортированных по crtime

Информационный аватар участника

4, 0

Что я знаю на данный момент:
ls -A отобразит все файлы, кроме тех, которые начинаются с точки
ls -d отобразит все каталоги
ls -m разделит содержимое запятыми < br />Для получения crtimes используйте:
stat filename даст мне номер inode
или
ls -i filename даст мне номер inode

чтобы получить crtime

Мне нужно знать, как связать все это воедино.

Информационный аватар участника

489, 285

--- Сообщение обновлено в 14:39 ---

что означает это слово "crtime"?

--- Сообщение обновлено в 14:50 ---

опция -c в команде ls сортирует файлы по времени их последней модификации, но если это директория, то это время последней модификации файлов в ней.

Информационный аватар участника

12 315, 4 560

--- Сообщение обновлено в 14:39 ---

что означает это слово "crtime"?

--- Сообщение обновлено в 14:50 ---

опция -c в команде ls сортирует файлы по времени их последней модификации, но если это директория, то это время последней модификации файлов в ней.

Привет, nezabudka,
Для файловых систем, которые отслеживают это, "crtime" означает время создания файла.

Время последней модификации (иногда называемое просто "mtime") каталога — это обычно время создания каталога, время последнего создания ссылки на файл в этом каталоге или время последнего создания ссылки на файл был удален из этого каталога, в зависимости от того, что произошло последним. Но, конечно же, его также можно установить на произвольное время, по крайней мере, с помощью функций языка C futimens(), utimensat() и utimes(). Изменение размера уже существующего файла в каталоге не меняет время модификации любого каталога, содержащего этот файл.

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

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