Как вывести имя файла linux
Обновлено: 06.07.2024
В этом руководстве для начинающих пользователей мы ознакомимся с основными командами для работы с файлами и каталогами (иногда их еще называют директориями) в Linux-системах.
Требования
Cервер с Ubuntu 20.04
Все команды, описанные ниже, будут работать и в других дистрибутивах Linux.
Расположение каталогов в файловой системе
При входе на сервер, вы, как правило, попадаете в домашний каталог вашей учетной записи, отведенный для хранения файлов и создания директорий.
Для того чтобы узнать, где располагается каталог, в котором мы сейчас находимся, используется команда:
Результат выполнения команды выглядит следующим образом:
Домашний каталог располагается после имени учетной записи пользователя, в приведенном примере он называется /demo. Этот каталог находится в каталоге с именем /home и в каталоге верхнего уровня, который называется root или корневой каталог, поэтому представлен одной косой чертой /.
Просмотр содержимого каталогов
Для просмотра содержимого каталога используется команда ls. Название этой команды является сокращением слов list files.
Просмотреть содержимое любой директории можно следующими способами:
Либо введя команду:
В результате выполнения команды отображаются файлы и каталоги, находящиеся внутри данного каталога:
К команде ls можно добавлять дополнительные флаги, например, чтобы показать детализированное представление (права, список владельцев файлов или папок, размер, дату последнего модифицирования) файлов и директорий в текущей директории, можно использовать флаг -l:
Результат выполнения команды:
Для просмотра списка всех файлов, включая скрытые файлы и каталоги, вы можете добавить флаг -a:
Результат выполнения команды:
Отобразить содержимое текущей директории с добавлением к именам символов, характеризующих тип, можно с помощью команды:
Результат выполнения команды:
Перемещение между каталогами
Для перехода в домашний каталог используется команда cd. Название этой команды является сокращением слов change directory.
Для перехода в домашний каталог пользователя user используется команда:
Для перехода в предыдущую директорию, в которой мы находились до перехода в текущую директорию также используется команда cd.
В Linux-системах каждый файл и каталог находятся в самой верхней директории, которая называется «корневой» и обозначается одним символом слэш /.
Абсолютный путь указывает на расположение каталога по отношению к этой директории верхнего уровня. Это позволяет обращаться к справочникам однозначным образом из любого места в файловой системе.
Каждый абсолютный путь должен начинаться с косой черты — символа слэш /.
Для перехода в директорию уровнем выше используется команда:
Для перехода в директорию двумя уровнями выше:
Операции с файлами и каталогами
Далее приведен список основных команд навигации в консоли Linux.
Создание
Создание файлов производится с помощью команды:
Создание каталогов выполняется с помощью команды вида:
Название этой команды является сокращением слов make directory.
Создание двух каталогов одновременно выполняется с помощью команды:
Для создания дерева каталогов используется команда следующего вида:
Удаление
Для удаления директорий используется команда rmdir имя_директории. Название этой команды является сокращением слов remove directory.
Для удаления файлов используется команда rm. Например, для удаления файла с именем file1 используется команда:
Команда rm также позволяет удалять не только файлы, но и каталоги.
Для удаления директории с именем dir1 со всеми подкаталогами и файлами используется опция -r (от слова recursive):
Можно удалить одновременно две директории со всем их содержимым:
Также можно использовать параметр -f, который означает, что при удалении не будет запрашиваться подтверждение.
Команда для удаления файла будет выглядеть так:
Команда для удаления каталога:
Перемещение
Для перемещения и переименования файлов и каталогов используется команда mv. Название этой команды является сокращением слова move.
Переименовать файл можно с помощью команды:
Для того чтобы переместить файл, используется команда:
Копирование
Для копирования используется команда cp. Название этой команды является сокращением слова copy.
Чтобы скопировать файл file1 и назвать его file2, используется команда:
Для того чтобы копировать директорию dir1 в директорию dir2, используется команда:
Скопировать файл с именем file1 в директорию с именем dir1, можно с помощью команды:
Редактирование файлов
Мы ознакомились с основными командами для работы с каталогами и файлами.
Далее мы изучим, как редактировать файлы и добавлять в них содержание.
Команда nano позволяет работать в одном из самых простых текстовых редакторов командной строки Linux, который занимает весь терминал в течение всего срока его использования.
В результате ввода в терминал команды nano будет открыт чистый файл.
Интерфейс выглядит следующим образом:
В верхней части открывшегося редактора отображается имя приложения и имя файла, который мы редактируем.
В середине должно располагаться содержимое файла, в настоящее время оно пустое.
В нижней части интерфейса расположен ряд комбинаций клавиш, которые указывают с основными элементами управления текстового редактора. Для каждого из них символ ^ означает клавишу CTRL.
Для того чтобы открыть справку используйте сочетание клавиш CTRL-G.
Закрывается справка с помощью сочетания клавиш CTRL-X. После закрытия справки мы возвращаемся к редактированию.
Вводить и редактировать можно любой текст, например, можно ввести: “Hello World!”
Для сохранения внесенных изменений следует нажать сочетание клавиш CTRL-O. Внимание! Это буква О, а не ноль.
Далее система попросит вас ввести либо подтвердить имя файла, который вы хотите сохранить:
Как вы можете видеть, параметры в нижней части окна редактирования также изменились. Они являются контекстными, то есть будут меняться в зависимости от того, что вы пытаетесь сделать.
После ввода имени файла нажмите клавишу ENTER.
Для того чтобы выйти из тестового редактора нажмите сочетание клавиш CTRL-X.
Если вы внесли изменения и не сохранили файл, вам будет предложено сохранить сделанные вами изменения:
Вы можете нажать клавишу Y, чтобы сохранить изменения, клавишу N для отмены изменений и выхода, или сочетание клавиш CTRL-C, чтобы отменить операцию выхода из режима редактирования файла.
Если вы решили сохранить изменения, вам будет предложено сохранить их в том же файле, который был отредактирован.
Нажмите клавишу ENTER, чтобы сохранить файл и выйти из редактора.
Заключение
Мы ознакомились с возможностями просмотра доступных файлов и каталогов, с основными командами для работы с файлами, которые позволяют просматривать, копировать, перемещать и удалять файлы, а также с основами редактирования в текстовом редакторе nano.
В GNU find вы можете использовать -printf параметр для этого, например:
Это не работает для меня, когда я использую несколько типов файлов (ключ -o) @ Urchin Нет причин, по которым это должно происходить, если у вас правильная логика (то есть -o имеет более низкий приоритет, чем подразумеваемый -a , поэтому вы часто захотите сгруппировать свои -o аргументы)Если в вашем поиске нет опции -printf, вы также можете использовать basename:
Цитирование точки с запятой - это еще один способ устранения неоднозначности: . <> ';'Используйте -execdir который автоматически содержит текущий файл <> , например:
Вы также можете использовать $PWD вместо . (в некоторых системах это не приведет к появлению дополнительной точки спереди).
Если у вас все еще есть лишняя точка, вы можете запустить:
-execdir utility [argument . ] ;
-execdir Первична идентична -exec первичный за исключением того , утилита будет выполнена из каталога, держит текущий файл .
Когда используется + вместо ; , то <> заменяется таким количеством путей, сколько возможно для каждого вызова утилиты. Другими словами, он напечатает все имена файлов в одну строку.
Я получаю ./filename вместо filename . В зависимости от ваших потребностей, это может или не может быть хорошо.Если вы используете GNU найти
Или вы можете использовать язык программирования, такой как Ruby (1.9+)
Если вам нравится решение bash (как минимум 4)
Если вы хотите выполнить какое-либо действие только с именем файла, использовать basename может быть сложно.
будет просто повторять базовое имя /my/found/path . Не то, что мы хотим, если мы хотим выполнить по имени файла.
Но вы можете затем xargs на выходе. например, чтобы убить файлы в каталоге, основываясь на именах в другом каталоге:
/clang+llvm-3.3/bin/ -type f -exec basename <> \;
На Mac (BSD find ) используйте:
-exec и -execdir медленно, xargs это король.
xargs Параллелизм также помогает.
Как ни странно, я не могу объяснить последний случай xargs без -n1 . Это дает правильный результат, и это самый быстрый ¯\_(ツ)_/¯
( basename принимает только 1 аргумент пути, но xargs отправит их все (на самом деле 5000) без -n1 . не работает на linux и openbsd, только macOS . )
Несколько больших цифр из системы Linux, чтобы увидеть, как это -execdir помогает, но все же намного медленнее, чем параллель xargs :
еще одна точка данных: на openbsd в долгосрочной перспективе find это -execdir становится самым быстрым, поскольку создание новых процессов - относительно дорогая операция.Честно говоря, basename и dirname решения проще, но вы также можете проверить это:
Как уже отмечали другие, вы можете комбинировать find и basename , но по умолчанию basename программа будет работать только по одному пути за раз, поэтому исполняемый файл придется запускать один раз для каждого пути (используя либо find . -exec или find . | xargs -n 1 ), что потенциально может быть медленным.
Если вы используете -a опцию on basename , то он может принимать несколько имен файлов за один вызов, что означает, что вы можете затем использовать xargs без -n 1 , чтобы сгруппировать пути вместе в гораздо меньшее количество вызовов basename , что должно быть более эффективным.
Вот сравнение времени, между xargs basename -a и xargs -n1 basename версиями. (Для сравнения «похоже на аналогию» время, указанное здесь, указано после первоначального фиктивного запуска, так что они оба выполняются после того, как метаданные файла уже скопированы в кэш ввода / вывода.) Я передал выходные данные в cksum в обоих случаях просто для демонстрации того, что вывод не зависит от используемого метода.
Как вы можете видеть, это действительно намного быстрее, чтобы избежать запуска basename каждый раз.
Я хочу, чтобы получить имя файла (без расширения) и расширение отдельно.
лучшее решение я нашел до сих пор:
это неправильно, потому что он не работает, если имя файла содержит несколько . символы. Если, скажем, у меня есть a.b.js , он будет рассматривать a и b.js , вместо a.b и js .
это можно легко сделать в Python с
но я бы предпочел не запускать Python переводчик только для этого, если возможно.
во-первых, получить имя файла без пути:
кроме того, вы можете сосредоточиться на последнем " / "пути вместо". который должен работать даже если у вас есть непредсказуемо расширениями:
дополнительные сведения см. В разделе расширение параметров оболочки в руководстве Bash.
обычно вы уже знаете расширение, поэтому вы можете использовать:
вы можете использовать магию переменных POSIX:
в этом есть оговорка, если ваше имя файла было в форме ./somefile.tar.gz затем echo $ жадно удалил бы самую длинную спичку в . и у вас будет пустая строка.
(вы можете обойти это с помощью временной переменной:
этой сайт больше объясняет.
это не работает, если файл не имеет расширения или имени файла. Вот что я использую; он использует только встроенные имена и обрабатывает больше (но не все) патологические имена файлов.
и вот некоторые тестовые примеры:
вам нужно предоставить basename с расширением, которое должно быть удалено, однако, если вы всегда выполняете tar С -z тогда вы знаете, что расширение будет .tar.gz .
это должно делать то, что вы хотите:
отлично работает, поэтому вы можете просто использовать:
команды, кстати, работают следующим образом.
команда NAME заменяет a "." символ, за которым следует любое число "." символы до конца строки, без ничего (т. е. он удаляет все из final "." до конца строки включительно). Это в основном не жадная подстановка с использованием обмана regex.
команда EXTENSION заменители a любое количество символов, за которыми следует "." символ в начале строки, без ничего (т. е. он удаляет все от начала строки до конечной точки, включительно). Это жадная подстановка, которая является действием по умолчанию.
используя Bash, есть также $ получить имя файла без расширения и $ чтобы получить расширение в одиночку. То есть,
можно использовать cut команда для удаления последних двух расширений ( ".tar.gz" часть):
как отметил Клейтон Хьюз в комментарии, это не будет работать на конкретном примере в вопросе. Поэтому в качестве альтернативы я предлагаю использовать sed с расширенными регулярными выражениями, например:
он работает, удаляя последние два (альфа-числовые) расширения безоговорочно.
[Обновлено снова после комментария от Андерса Линдаля]
нет необходимости беспокоиться с awk или sed или даже perl для этой простой задачи. Есть чистый-Баш, os.path.splitext() -совместимое решение, которое использует только разложений параметра.
разделить путь пути на пару (root, ext) такое, что root + ext == path и ext пусто или начинается с точки и содержит не более одного периода. Ведущие периоды базовое имя игнорируется; splitext('.cshrc') возвращает ('.cshrc', '') .
почитание ведущих периодов
игнорирование ведущих периодов
вот тестовые примеры для игнорирование ведущих периодов реализация, которая должна соответствовать ссылочной реализации Python на каждом входе.
вот некоторые альтернативные предложения (в основном в awk ), включая некоторые расширенные варианты использования, такие как извлечение номеров версий для пакетов программного обеспечения.
все варианты использования, используя исходный полный путь в качестве входных данных, вне зависимости от промежуточных результатов.
[Пересмотрено с однострочного до общего bash функции поведение сейчас соответствует dirname и basename служебные программы; обоснование добавил.]
на принято отвечать работает в типичный делам, а не в edge делам, а именно:
- для имен файлов без расширения (называется суффикс в остальной части этот ответ), extension=$ возвращает входное имя файла, а не пустая строка.
- extension=$ не включает начальное . , противоречит Конвенции.
- слепо знаком . не будет работать для имен без суффикса.
таким образом, сложность робастное разрешение которое покрывает все случаи края требует функции - см. его определение ниже; это может возвратить все компоненты контура.
Как получить полное (с путём относительно / ) имя файла в одну команду?
Бывает, работаешь в консоли, и нужно скопировать /полный/путь/к/файлу , например, чтобы в соседней консоли использовать его как аргумент для scp . Приходится вызывать pwd , чтобы скопировать путь к текущей папке, и ls , чтобы скопировать имя файла. Можно ли это сделать в одну команду?
3,169 18 18 серебряных знаков 42 42 бронзовых знакаreadlink -f покажет /полный/путь/к/файлу.ext , дополнительно "раскрыв" все символические ссылки и заменив их на "канонические" пути. Пример показателен:
Здесь /tmp/baz.ext является симлинком на /tmp/foo/bar.ext .
Предложенное решение работает в Linux и FreeBSD, но не работает в Mac OS - у них там своя атмосфера.
3,169 18 18 серебряных знаков 42 42 бронзовых знакаПредложу вариант чуть понавороченней:
- Читаем полный путь
- Сразу же копируем его в буфер обмена, предварительно .
- . вырезав конечные СR/LF (если не хотим, чтобы они добавлялись при вставке)
Для файлов относительно текущего каталога
или с тем же результатом
6,844 2 2 золотых знака 23 23 серебряных знака 52 52 бронзовых знакаможно, например, подставлять то, что содержится в переменной окружения $PWD (или в любой другой переменной окружения), даже без «команды», а всего лишь клавиатурным сочетанием. если, конечно, ваша оболочка использует gnu/readline для редактирования командной строки.
например, такая команда привяжет к клавиатурному сочетанию alt+o подстановку значения переменной $PWD (и слэша в конце — для удобства) в текущую позицию курсора:
здесь \eo — это и есть alt+o (а, например, \C-o — это ctrl+o ).
чтобы данная привязка создавалась автоматически в каждой сессии оболочки, можно добавить приведённую команду, например, в стартовый скрипт используемой оболочки —
а ещё лучше — добавить строку, которая в примере выше передавалась встроенной команде оболочки bind, прямо в файл
Читайте также: