- bash вычленить имя файла из полного пути
- Извлечение имени файла без пути и расширения в bash [дубликат]
- 9 ответов:
- Извлечь имя файла и расширение в Bash
- 30 ответов
- Эталонной Реализации
- Реализация Bash
- почитание ведущих периодов
- игнорирование ведущих периодов
- тесты
- Извлечение имени файла без пути и расширения в bash [дубликат]
- 9 ответов
- Извлеките базовое имя файла без пути и расширения в bash
- 9 ответов
- Похожие вопросы:
bash вычленить имя файла из полного пути
Всем привет! Есть текстовый файл, вида:
выглядело бы более наглядно с cat в начале
Больше пайпов!
это делается одним грепом
О человечество! Это прекрасно! Всем огромное спасибо, тему можно считать решённой!
правильно! больше, еще больше велосипедов!
расскажи-ка, чем basename не подошел?
закон топикстартера: из 64 предложеных решений будет скрупулёзно выбрано самое вот такое
Это очень юниксвейно, да, на каждый возможный случай — своя утилита. Вот за это я и ненавижу linux. На самом деле лучший вариант из предложенных. Не надо плодить сущности.
На самом деле, я не знаю, что правильнее выбрать, поэтому выбрал то, что мне проще понять. Попробую варианты с седом и бэйснеймом и решу.
Ле. Человек препологающий, что RoR транслируется в js, что-то считает.
т.е. мне действительно интересно
я бы набыдлокодил grep path file | xargs basename
Ни разу не граммарнаци, но 3 ошибки в одном слове, даже для меня пребор. Марш учить уроки, сучка!
сомневаюсь, что он осилит ответить, потому вот:
\K [6] Keep the stuff left of the \K, don’t include it in $&
Ты крут, спасибо
Это очень юниксвейно, да, на каждый возможный случай — своя утилита. Вот за это я и ненавижу linux.
а я ненавижу из-за таких как ты пионеров, которые велосипеды придумывают типа sed ‘s|.*/\([^/]*\)$|\1|’
А sed не отдельная утилита, а встроенная команда bash?
Подсказка: basename входит в coreutils, а sed — отдельный пакет.
Это очень юниксвейно, да, на каждый возможный случай — своя утилита.
Так чё сидишь. Иди проси, чтобы в МС Офис добавили кнопку для определения имени файла. «Один комбайн, чтобы править всеми!»
Ага, а рядом приписывать: «# extracts basename from path»
Источник
Извлечение имени файла без пути и расширения в bash [дубликат]
этот вопрос уже есть ответ здесь:
- Извлечь имя файла и расширение в Bash 35 ответов
дали имена файлов, как это:
Я надеюсь получить:
почему это не сработает?
Как правильно это сделать?
9 ответов:
вы не должны вызывать внешний
на basename команда имеет два разных вызова; в одном вы указываете только путь, и в этом случае он дает вам последний компонент, а в другом вы также даете суффикс, который он удалит. Таким образом, вы можете упростить свой пример кода, используя второй вызов basename. Кроме того, будьте осторожны, чтобы правильно цитировать вещи:
комбинация basename и cut отлично работает, даже в случае двойного окончания, например .tar.gz :
было бы интересно, если это решение требует меньше арифметической мощности, чем расширение параметра Bash.
чисто bash , нет basename , без переменной жонглирования. Установите строку и echo :
Примечание: bash extglob опция должна быть «on», (on Ubuntu он «включен» по умолчанию), если это не так, сделайте:
- $
$s. - // заменить каждый экземпляр узор.
- +( матч один или несколько на список шаблон в скобках.
- *\/ соответствует что-нибудь до / . (1-й образец)
- | или. (разделитель шаблонов.)
- .* соответствует что-нибудь после . . (2-й образец)
- ) конец список шаблон.
- > расширение конечного параметра — так как нет / (который будет предшествовать замене строки), совпадающие шаблоны удаляются.
соответствующей man bash справочная информация:
я нуждался в этом, так же, как просил bongbang и w4etwetewtwet.
вот еще один (более сложный) способ получения имени файла или расширения, сначала используйте rev команда инвертировать путь к файлу, вырезать из первого . а затем снова инвертировать путь к файлу, например:
Если вы хотите играть хорошо с пути к файлам Windows (под Cygwin) вы также можете попробовать это:
Это будет учитывать разделители обратной косой черты при использовании BaSH на Windows.
просто альтернатива, которую я придумал, чтобы извлечь расширение, используя сообщения в этой теме с моей собственной небольшой базой знаний, которая была мне более знакома.
Примечание: пожалуйста, сообщите о моем использовании кавычек; это сработало для меня, но я мог бы упустить что-то при их правильном использовании (я, вероятно, использую слишком много).
Источник
Извлечь имя файла и расширение в Bash
Я хочу, чтобы получить имя файла (без расширения) и расширение отдельно.
лучшее решение я нашел до сих пор:
это неправильно, потому что он не работает, если имя файла содержит несколько . символы. Если, скажем, у меня есть a.b.js , он будет рассматривать a и b.js , вместо a.b и js .
это можно легко сделать в Python с
но я бы предпочел не запускать Python переводчик только для этого, если возможно.
30 ответов
во-первых, получить имя файла без пути:
кроме того, вы можете сосредоточиться на последнем » / «пути вместо». который должен работать даже если у вас есть непредсказуемо расширениями:
дополнительные сведения см. В разделе расширение параметров оболочки в руководстве 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’, ») .
Реализация Bash
почитание ведущих периодов
игнорирование ведущих периодов
тесты
вот тестовые примеры для игнорирование ведущих периодов реализация, которая должна соответствовать ссылочной реализации Python на каждом входе.
вот некоторые альтернативные предложения (в основном в awk ), включая некоторые расширенные варианты использования, такие как извлечение номеров версий для пакетов программного обеспечения.
все варианты использования, используя исходный полный путь в качестве входных данных, вне зависимости от промежуточных результатов.
[Пересмотрено с однострочного до общего bash функции поведение сейчас соответствует dirname и basename служебные программы; обоснование добавил.]
на принято отвечать работает в типичный делам, а не в edge делам, а именно:
- для имен файлов без расширения (называется суффикс в остальной части этот ответ), extension=$
возвращает входное имя файла, а не пустая строка. - extension=$
не включает начальное . , противоречит Конвенции. - слепо знаком . не будет работать для имен без суффикса.
- filename=»$
» будет пустая строка, если имя входного файла начинается с . и не содержит никаких новых . символы (например, .bash_profile ) — противоречит Конвенции.
таким образом, сложность робастное разрешение которое покрывает все случаи края требует функции — см. его определение ниже; это может возвратить все компоненты контура.
обратите внимание, что аргументы после входного пути свободно выбираются, позиционная переменная имена.
Пропустить переменные не из проценты, которые приходят перед теми, которые есть, укажите _ (использовать выбрасываемую переменную $_ ) или » ; например, чтобы извлечь только корень и расширение файла, используйте splitPath ‘/etc/bash.bashrc’ _ _ fnameroot extension .
тестовый код, который выполняет функции:
ожидаемый результат — обратите внимание на граничные случаи:
- имя файла без суффикса
- имя файла, начиная с . (не считается началом суффикс)
- входной путь, заканчивающийся в / (символы / игнорируется)
- входной путь, который является только имя файла ( . возвращается как родительский путь)
- имя файла, которое имеет больше, чем . -маркер с префиксом (суффиксом считается только последний):
Источник
Извлечение имени файла без пути и расширения в bash [дубликат]
этот вопрос уже есть ответ здесь:
данные имена файлов, как эти:
Я надеюсь получить:
почему это не сработает?
Как правильно это сделать?
9 ответов
вам не нужно вызывать внешний
на имени команда имеет два разных вызова; в одном вы указываете только путь, в этом случае он дает вам последний компонент, а в другом вы также даете суффикс, который он удалит. Таким образом, вы можете упростить свой пример кода, используя второй вызов basename. Кроме того, будьте осторожны, чтобы правильно цитировать вещи:
комбинация basename и cut отлично работает, даже в случае двойного окончания, такого как .tar.gz :
было бы интересно, если это решение требует меньше арифметической мощности, чем расширение параметра Bash.
чисто bash , нет basename , нет переменной жонглирование. Установите строку и echo :
Примечание: bash extglob опция должна быть «on», (on Ubuntu это» on » по умолчанию), если это не так, сделайте:
- $
$s. - // замените каждый экземпляр узор.
- +( матч один или несколько на список шаблон в скобках.
- *\/ все матчи до / . (1-й образец)
- | или. (разделитель шаблонов.)
- .* соответствует что-нибудь после . . (2-й образец)
- ) конец список шаблон.
- > параметр расширения, поскольку нет / (который предшествует замене строки), совпадающие шаблоны удаляются.
соответствующей man bash справочная информация:
мне это было нужно, так же, как спросили bongbang и w4etwetewtwet.
вот еще один (более сложный) способ получить имя файла или расширение, сначала используйте rev команда инвертировать путь к файлу, вырезать из первого . а затем снова инвертируйте путь к файлу, например:
Если вы хотите играть хорошо с путями файлов Windows (под Cygwin), вы также можете попробовать следующее:
это будет учитывать разделители обратной косой черты при использовании BaSH в Windows.
просто альтернатива, которую я придумал, чтобы извлечь расширение, используя сообщения в этом потоке с моей собственной небольшой базой знаний, которая была мне более знакома.
Примечание: пожалуйста, посоветуйте мне использовать цитаты; это сработало для меня, но я мог бы пропустить что-то по их правильному использованию (я, вероятно, использую слишком много).
Источник
Извлеките базовое имя файла без пути и расширения в bash
Учитывая такие имена файлов, как эти:
Я надеюсь получить:
Почему это не работает?
Как правильно это сделать?
9 ответов
Один из наших инструментов здесь поддерживает файл в формате — file.txt.1. Последний 1 всегда является числовым значением и увеличивается при каждом сохранении файла , так что файловая система имеет несколько файлов. Теперь в другом приложении C# я хотел бы обработать эти имена файлов. В этом я.
У меня есть длинный путь к файлу, например /path/to/file/dir1/dir2/file.txt.gz Мне интересно получить имя файла без последнего расширения (например, file.txt ) и имя родительского каталога ( dir2 , мне не нужен полный путь к родительскому каталогу, только его имя). Как я могу сделать это в bash?
Вам не нужно вызывать внешнюю команду basename . Вместо этого вы можете использовать следующие команды:
Обратите внимание, что это решение должно работать во всех последних ( после 2004 года ) POSIX совместимых оболочках (например , bash , dash , ksh и т.д.).
Команда basename имеет два разных вызова; в одном вы указываете только путь, и в этом случае она дает вам последний компонент, в то время как в другом вы также даете суффикс, который она удалит. Таким образом, вы можете упростить свой пример кода, используя второй вызов basename. Кроме того, будьте осторожны, чтобы правильно цитировать вещи:
Комбинация basename и cut отлично работает, даже в случае двойного окончания, такого как .tar.gz :
Было бы интересно, если бы это решение требовало меньшей арифметической мощности, чем расширение параметра Bash.
Мне это было нужно, как и просили бонгбанг и w4etwetewtwet.
Чистый bash , никакой basename , никакого жонглирования переменными. Установите строку и echo :
Примечание: параметр bash extglob должен быть «on», ( по умолчанию Ubuntu устанавливает extglob «on»), если это не так, сделайте:
- $
$p .
- // замените каждый экземпляр следующего шаблона.
- +( соответствует одному или несколькимспискам шаблонов в скобках ( т. е. до пункта #7 ниже).
- 1-й шаблон: *\/ соответствует чему-либо перед буквальным символом » / «.
- разделитель шаблонов | , который в данном случае действует как логический OR .
- 2-й шаблон: .* соответствует чему-либо после буквального » . «- то есть в bash » . » — это просто символ точки, а неточка regex .
- ) список конечных шаблонов .
- > расширение конечного параметра. При подстановке строки обычно есть еще один / , за которым следует строка замены. Но поскольку там нет / , совпадающие шаблоны заменяются ничем; это удаляет совпадения.
Соответствующая man bash справочная информация:
- расширенное сопоставление шаблонов :
Как бы я получил только имя файла без расширения и без пути? Следующее не дает мне никакого расширения, но у меня все еще есть прикрепленный путь: source_file_filename_no_ext=$
Учитывая имя файла foo/bar.baz , мы можем сказать , что foo/ -это dirname , bar.baz — базовое имя, а .baz — extname . Но есть ли подобный термин, который мы можем использовать для части foo/bar или bar -то есть “имя файла без расширения”?
Вот еще один (более сложный) способ получения имени файла или расширения: сначала используйте команду rev , чтобы инвертировать путь к файлу, вырезать из первого . , а затем снова инвертировать путь к файлу, вот так:
Если вы хотите хорошо играть с Windows путями к файлам (под Cygwin), вы также можете попробовать это:
Это будет учитывать разделители обратной косой черты при использовании BaSH на Windows.
Просто альтернатива, которую я придумал, чтобы извлечь расширение, используя сообщения в этой теме с моей собственной небольшой базой знаний, которая была мне более знакома.
Примечание: Пожалуйста, посоветуйте мне использовать цитаты; это сработало для меня, но я могу что-то упустить в их правильном использовании (я, вероятно, использую слишком много).
Используйте команду basename. Его главная страница находится здесь: http://unixhelp.ed.ac.uk/CGI/ человек-cgi?базовое имя
Похожие вопросы:
пожалуйста, дайте мне знать, как получить имя файла только без расширения из пути к файлу. Нравится У меня путь к файлу в базе данных есть Attachments\abc\demo.jpg Я хотел бы получить только demo.
Как уже упоминалось выше,я пытался получить имя файла без его каталога и расширения из файла скрипта bash. Я хочу, чтобы выходные данные отображались как -> filename : значение sum/count. я пробовал.
Как получить имя файла без расширения из пути в Python? Например, если бы у меня было «/path/to/some/file.txt» , я бы хотел «file» .
Один из наших инструментов здесь поддерживает файл в формате — file.txt.1. Последний 1 всегда является числовым значением и увеличивается при каждом сохранении файла , так что файловая система имеет.
У меня есть длинный путь к файлу, например /path/to/file/dir1/dir2/file.txt.gz Мне интересно получить имя файла без последнего расширения (например, file.txt ) и имя родительского каталога ( dir2 .
Как бы я получил только имя файла без расширения и без пути? Следующее не дает мне никакого расширения, но у меня все еще есть прикрепленный путь: source_file_filename_no_ext=$
Учитывая имя файла foo/bar.baz , мы можем сказать , что foo/ -это dirname , bar.baz — базовое имя, а .baz — extname . Но есть ли подобный термин, который мы можем использовать для части foo/bar или.
Можно ли получить имя файла без расширения из пути к файлу src? В качестве примера предположим, что src-файл my-file.png-находится по адресу images/my-file.png. В моей задаче у меня есть это в.
В bash я могу получить базовое имя (имя без пути) найденных файлов следующим образом: find . -exec basename <> \; и я могу получить размер файла вот так: find . -exec ls -l <> \; | awk ‘
Я хочу создать скрипт, который переименует файл с 2 расширениями, удалив расширение midle. В связи с этим я нашел эту замечательную нить: Извлеките имя файла и расширение в Bash Кто-то опубликовал.
Источник