Bash имя файла без расширения

у меня есть следующие for цикл индивидуально sort все текстовые файлы внутри папки (т. е. создание отсортированного выходного файла для каждого).

это почти идеально, за исключением того, что он в настоящее время выводит файлы в формате:

. тогда как хотелось бы выводить файлы в формате:

это так $ переменная содержит имя файла с расширением. Я запускаю Cygwin на вершине Windows. Я не уверен, как это будет вести себя в истинной среде Linux, но в Windows это смещение расширения делает файл недоступным для Проводника Windows.

как я могу отделить имя файла от расширения, так что я могу добавить _sorted суффикс между ними, что позволяет мне легко различать оригинальные и сортированные версии файлов, сохраняя при этом расширения файлов Windows нетронутыми?

Я смотрел на то, что может be возможно решения, но мне они кажутся более приспособленными для решения более сложных проблем. Что еще важнее, с моим нынешним bash знание, они идут над моей головой, так что я держу надежду, что есть более простое решение, которое относится к моей скромной for цикл, или же кто-то может объяснить, как применить эти решения к моей ситуации.

1 ответов

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

указывает, что расширение известно заранее (Примечание: POSIX-совместимые среды чувствительны к регистру, *.txt не соответствует FOO.TXT ). В таком случае

должен возвращать имя без расширения ( basename также удаляет путь к каталогу: /directory/path/filename → filename ; в вашем случае это не имеет значения, потому что $file не содержит такого пути). Для использования инструмента в коде необходима подстановка команд, которая выглядит примерно так: $(some_command) . Команда подстановки принимает вывод some_command , обрабатывает его как строку и помещает в $(…) есть. Ваше конкретное перенаправление будет

вложенные кавычки здесь в порядке, потому что Bash достаточно умен, чтобы знать кавычки в $(…) парные вместе.

это можно улучшить. Примечание basename — это отдельный исполняемый файл, а не встроенная оболочка (в bash run type basename для всех type cd ). Нерест любой лишний процесс обходится дорого, требует ресурсов и времени. Нерест его в петле обычно выполняет плохо. Поэтому вы должны использовать все, что предлагает вам оболочка, чтобы избежать дополнительных процессов. В этом случае решение:

синтаксис описан ниже для более общего случай.

в случае, если вы не знаете расширение:

  • $ — $file , но самая короткая строка, соответствующая *. удаляется спереди;
  • $ — $file , но самая длинная строка, соответствующая *. удаляется спереди; используйте его, чтобы получить только расширение;
  • $ — $file , но самая короткая строка, соответствующая .* удаляется из конец; используйте его, чтобы получить все, кроме расширения;
  • $ — $file , но с самой длинной строкой, соответствующей .* удаляется с конца;

сопоставление шаблонов похоже на glob, а не на regex. Это значит * — подстановочный знак для нуля или более символов, ? — это замена одного персонажа (нам не нужны ? в вашем случае, хотя). Когда вы вызываете ls *.txt или for file in *.txt; вы используете тот же шаблон, соответствующий механизм. Узор без подстановочных знаков допускается. Мы уже использовали $ здесь .txt — это шаблон.

но будьте осторожны:

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

он работает, идентифицируя все, кроме расширения ( $ ), затем удаляет это из всей строки. Результаты выглядят так:

Примечание. the . включен в это время. Вы можете получить неожиданные результаты, если $file содержит литерал * или ? ; но Windows (где расширения имеют значение) не дает эти символы в именах файлов в любом случае, так что вам может быть все равно. Однако […] или <…>, если присутствует, может вызвать их собственную схему сопоставления с образцом и сломать решение!

ваше" улучшенное " перенаправление будет:

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

действительно улучшенное перенаправление:

двойное цитирование делает $ не действовать как шаблон! Bash достаточно умен, чтобы различать внутренние и внешние кавычки, потому что внутренние встроены во внешнюю $ <…>синтаксис. я думаю, что это правильно путь.

еще одно (несовершенное) решение, давайте проанализируем его по образовательным причинам:

заменяет первый . с _sorted. . Он будет работать нормально, если у вас есть не более одной точки в $file . Похожий синтаксис $ , который заменяет все точки. Насколько я знаю, нет никакого варианта, чтобы заменить последние точка только.

все еще первоначальное решение для файлов с . выглядит надежной. Решение для без расширений $file тривиально: $_sorted . Теперь все, что нам нужно, это способ разделить два дела. Вот это:

возвращает статус выхода 0 (true) тогда и только тогда, когда содержимое $file переменная соответствует шаблону правой стороны. Шаблон говорит: "есть точка после хотя бы одного символа" или, что то же самое, "есть точка, которая не находится в начале". Дело в том, чтобы лечить скрытые файлы Linux (например, .bashrc ), а без расширений, если есть другое точка где-то.

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

логика теперь выглядит так:

после этого, $file1 содержит желаемое имя, поэтому перенаправление должно быть

и весь код ( *.txt заменить * , чтобы указать нам работа с любым расширением или без расширения):

это также попытается обработать каталоги (если они есть); вы уже знаете что делать исправить.

Я хочу, чтобы получить имя файла (без расширения) и расширение отдельно.

лучшее решение я нашел до сих пор:

это неправильно, потому что он не работает, если имя файла содержит несколько . символы. Если, скажем, у меня есть a.b.js , он будет рассматривать a и b.js , вместо a.b и js .

Читайте также:  За какое время проходит 24 кадра кинопленки

это можно легко сделать в 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’, ») .

почитание ведущих периодов

игнорирование ведущих периодов

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

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

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

[Пересмотрено с однострочного до общего bash функции поведение сейчас соответствует dirname и basename служебные программы; обоснование добавил.]

на принято отвечать работает в типичный делам, а не в edge делам, а именно:

  • для имен файлов без расширения (называется суффикс в остальной части этот ответ), extension=$ возвращает входное имя файла, а не пустая строка.
  • extension=$ не включает начальное . , противоречит Конвенции.
  • слепо знаком . не будет работать для имен без суффикса.
  • filename="$" будет пустая строка, если имя входного файла начинается с . и не содержит никаких новых . символы (например, .bash_profile ) — противоречит Конвенции.
  • таким образом, сложность робастное разрешение которое покрывает все случаи края требует функции — см. его определение ниже; это может возвратить все компоненты контура.

    обратите внимание, что аргументы после входного пути свободно выбираются, позиционная переменная имена.
    Пропустить переменные не из проценты, которые приходят перед теми, которые есть, укажите _ (использовать выбрасываемую переменную $_ ) или » ; например, чтобы извлечь только корень и расширение файла, используйте splitPath ‘/etc/bash.bashrc’ _ _ fnameroot extension .

    тестовый код, который выполняет функции:

    ожидаемый результат — обратите внимание на граничные случаи:

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

    1716 ibz [2009-06-08 17:00:00]

    Я хочу получить имя файла (без расширения) и расширение отдельно.

    Лучшее решение, которое я нашел, это:

    Это неправильно, потому что не работает, если имя файла содержит несколько . персонажи. Если, скажем, у меня есть abjs , он рассмотрит a и b.js вместо ab и js .

    Это может быть легко сделано в Python с

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

    Есть идеи получше?

    string bash filenames

    36 ответов

    2944 Решение Petesh [2009-06-08 17:05:00]

    Сначала получите имя файла без пути:

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

    Вы можете проверить документацию:

    • В Интернете в разделе " 3.5.3 Расширение параметров оболочки "
    • На странице руководства bash в разделе "Расширение параметров"

    527 Juliano [2009-06-08 17:05:00]

    Подробнее см. расширение параметров оболочки в руководстве Bash.

    306 Tomi Po [2011-10-19 13:56:00]

    Обычно вы уже знаете расширение, поэтому вы можете использовать:

    128 sotapme [2013-02-05 12:09:00]

    Вы можете использовать магию переменных POSIX:

    Там предостережение в том, что если ваше имя файла имеет форму ./somefile.tar.gz , то echo $ будет с жадностью удалять самое длинное совпадение с . , и у вас будет пустая строка.

    (Вы можете обойти это с помощью временной переменной:

    Этот сайт объясняет больше.

    66 Doctor J [2009-09-10 08:17:00]

    Это не работает, если файл не имеет расширения или нет имени файла. Вот что я использую; он использует только встроенные и обрабатывает больше (но не всех) патологических имен файлов.

    Читайте также:  Tegra x1 vs snapdragon 845

    И вот несколько тестовых примеров:

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

    Вам нужно предоставить базовое имя с расширением, которое должно быть удалено, однако если вы всегда выполняете tar с помощью -z , то вы знаете, что расширение будет .tar.gz .

    Это должно делать то, что вы хотите:

    27 paxdiablo [2009-06-08 17:14:00]

    работает отлично, поэтому вы можете просто использовать:

    Команды, кстати, работают следующим образом.

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

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

    26 Kebabbert [2010-07-21 13:24:00]

    Меллен пишет в комментарии к сообщению в блоге:

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

    Вы можете использовать команду cut для удаления последних двух расширений (часть ".tar.gz" ):

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

    Он работает, удаляя последние два (альфа-числовые) расширения без каких-либо условий.

    [Обновлено после комментария Андерса Линдаля]

    22 Cyker [2016-12-02 12:04:00]

    Не нужно беспокоиться о awk или sed или даже perl для этой простой задачи. Существует чистое Bash, os.path.splitext() -компонентное решение, которое использует только разложения параметров.

    Разделите путь пути в пару (root, ext) таким образом, чтобы root + ext == path , а ext пуст или начинается с периода и содержит не более одного периода. Ведущие периоды в basename игнорируются; splitext(‘.cshrc’) возвращает (‘.cshrc’, ») .

    Почитание ведущих периодов

    Игнорирование ведущих периодов

    Ниже приведены тестовые примеры для Игнорирования реализации ведущих периодов, которые должны соответствовать реализации ссылок Python на каждом входе.

    Результаты испытаний

    Все тесты прошли.

    20 henfiber [2015-06-16 12:02:00]

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

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

    14 Ron [2017-04-22 17:39:00]

    Наименьшее и простое решение (в одну строку) это:

    12 mklement0 [2013-08-09 06:45:00]

    [Пересмотрено от однострочного к общей функции bash, поведение теперь совместимо с утилитами dirname и basename ; Обоснование добавлено.]

    принятый ответ хорошо работает в типичных случаях, но не работает в случаях краев, а именно:

    • Для имен файлов без расширения (называемых суффиксами в оставшейся части ответа) extension=$ возвращает имя входного файла, а не пустую строку.
    • extension=$ не включает начальный . , вопреки соглашению.
    • Слепо, добавление . не будет работать для имен файлов без суффикса.
  • filename="$" будет пустой строкой, если имя входного файла начинается с . и не содержит следующих символов . (например, .bash_profile ) — вопреки соглашению.
  • Таким образом, сложность надежного решения, охватывающего все случаи краев, вызывает функцию — см. ее определение ниже; он может возвращать все компоненты пути.

    Обратите внимание, что аргументы после входного пути свободно выбираются, имена позиционных переменных.
    Чтобы пропустить переменные, не представляющие интерес, которые приходят перед теми, которые есть, укажите _ (использовать переменную throw-away $_ ) или » ; например, для извлечения корня и расширения имени файла, используйте splitPath ‘/etc/bash.bashrc’ _ _ fnameroot extension .

    Тестовый код, который выполняет функцию:

    Ожидаемый результат — обратите внимание на краевые случаи:

    • имя файла без суффикса
    • имя файла, начинающееся с . (не считается началом суффикса)
    • путь ввода, заканчивающийся на / (trailing / игнорируется)
    • входной путь, только имя файла ( . возвращается как родительский путь)
    • имя файла, у которого есть более чем . -prefixed токен (только последний считается суффиксом):

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

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

    Итак, если FILE — eth0.pcap.gz , EXTENSION будет pcap.gz

    Используя ту же логику, вы также можете получить имя файла, используя ‘-‘, с разрезом следующим образом:

    Это работает даже для имен файлов, которые не имеют расширения.

    7 Al3xXx [2011-12-09 22:27:00]

    Итак, если я правильно понял, проблема заключается в том, как получить имя и полное расширение файла с несколькими расширениями, например, stuff.tar.gz .

    Это работает для меня:

    Это даст вам stuff как имя файла и .tar.gz как расширение. Он работает для любого количества расширений, включая 0. Надеюсь, это поможет любому, у кого есть такая же проблема =)

    7 F. Hauri [2013-07-07 18:47:00]

    Волшебное распознавание файлов

    В дополнение к множеству хороших ответов на этот вопрос я хотел бы добавить:

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

    Расширения стандартов можно найти в /etc/mime.types (на моем рабочем столе Debian GNU/Linux. См. man file и man mime.types . Возможно, вам нужно установить утилиту file и пакеты mime-support ):

    Вы можете создать функцию bash для определения правильного расширения. Есть небольшой (не идеальный) образец:

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

    (Это вдохновлено правильным ответом @Petesh):

    Я использую следующие script

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

    Естественно, этот метод не работает для файлов .tar.gz. Однако это может быть выполнено в двухэтапном процессе. Если расширение является gz, то еще раз проверьте, есть ли расширение tar.

    Вот код с AWK. Это можно сделать проще. Но я не очень хорош в AWK.

    Читайте также:  Современные единицы измерения информации

    4 Dennis [2014-03-31 00:41:00]

    Как извлечь имя файла и расширение в fish:

    Предостережения: Разделение на последнюю точку, которая хорошо работает для имен файлов с точками в них, но не подходит для расширений с точками в них. См. Пример ниже.

    Применение:

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

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

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

    2 enyo [2010-07-12 15:44:00]

    Если вы хотите проверить это, все последующие работы и просто удалите расширение:

    2 cvr [2015-12-04 19:26:00]

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

    2 RandyP [2014-06-10 00:18:00]

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

    Это отключит последнее вхождение .tar. .

    В более общем плане, если вы хотите удалить последнее вхождение. . затем

    должен работать нормально.

    1 Blauhirn [2017-09-16 07:41:00]

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

    1-я строка объясняется: она соответствует PATH.EXT или НИЧЕГО и заменяет ее EXT. Если ANYTHING был сопоставлен, группа ext не будет записана.

    1 Alex Gray [2013-08-27 05:18:00]

    Основанный в основном вне @mklement0 превосходный и наполненный случайными, полезными bashisms — так же как другие ответы на этот/другие вопросы / ", что darn интернет". Я обернул это все немного, немного более понятной, многоразовой функции для моего (или вашего) .bash_profile , который заботится о том, что (я считаю) должно быть более надежной версией dirname / basename /что у вас есть.

    Из приведенных выше ответов, кратчайший oneliner, чтобы имитировать Python

    Предполагая, что ваш файл действительно имеет расширение,

    ИМХО, лучшее решение уже было дано (с использованием расширения параметров оболочки) и является лучшим на данный момент.

    Однако я добавляю эту, которая просто использует команды dumbs, которая неэффективна и которую никто никогда не должен использовать серьезно:

    Добавлено просто для удовольствия 🙂

    0 chown [2012-05-19 21:59:00]

    Используя пример файла /Users/Jonathan/Scripts/bash/MyScript.sh , этот код:

    приведет к тому, что $ будет MyScript и $ равен .sh :

    0 scolfax [2016-10-13 08:56:00]

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

    Вот как это работает:

    sed анализирует входной путь и печатает следующие компоненты пути в порядке по отдельным строкам:

    • путь к каталогу с завершающим символом косой черты
    • путь к каталогу без символа конечной косой черты
    • имя файла с расширением
    • имя файла без расширения
    • расширение файла с символом ведущей точки
    • расширение файла без символа ведущей точки

    tr преобразует вывод sed в строку с разделителями символов разделителя с указанными выше компонентами пути.

    read использует разделительный символ как разделитель полей (IFS = "$ separatorChar" ) и присваивает каждому из компонентов пути свою соответствующую переменную.

    Здесь работает конструктор sed:

    • s/^ [[: space:]] +// и s/[[: space:]] + $// листинг любых ведущих и/или завершающие пробельные символы
    • t l1 и : l1 обновляет функцию t для следующей функции s
    • s/^ ([^/] | $)// и t тесты для недопустимого пути ввода (который не начинается с косой черты) в этом случае он оставляет все выходные строки пустыми и завершает команду sed
    • s/[/] + $// удаляет любые завершающие слэши
    • t l2 и : l2 обновляет функцию t для следующей s-функции
    • s/^ $/filesystem/ [новая строка] файловая система /p и t тесты для специального случая, когда входной путь состоит из корневого каталога /, в в этом случае он выводит файловую систему / и файловую систему для строк dirPathWithSlash и dirPath, оставляет все остальные выходные строки пустыми, и завершает команду sed
    • h сохраняет входной путь в пространстве удержания
    • s/^ (. *) ([/]) ([^/] +) $/ 12[newline]1[newline]3/p печатает строки dirPathWithSlash, dirPath и fileNameWithExt
    • g извлекает входной путь из пространства удержания
    • t l3 и : l3 обновляет функцию t для следующей s-функции
    • s/^.* [/] ([^/] +) ([.]) ([A-Za-Z0-9] +) $/ 1[перевод строки]23[newline]3/p и t печатает имя_файла, fileExtWithDot и fileExt вывода для случая, когда существует расширение файла (предполагается, что оно состоит только из буквенно-цифровых символов), а затем завершает команду sed
    • s/^.* [/] (. +) $/ 1/p выводит имя_файла, но не fileExtWithDot и fileExt для случая, когда расширение файла не существует, а затем завершает команду sed

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

    FYI: Полная программа транслитерации и более тестовые примеры можно найти здесь: https://www.dropbox.com/s/4c6m0f2e28a1vxf/avo >

    0 Bill Gale [2013-08-09 02:59:00]

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

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

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

    чтобы получить имя файла и

    чтобы получить расширение.

    Возможно, в tar есть опция; ты проверил человека? В противном случае вы можете использовать Bash расширение строки:

    -1 SCS [2011-07-01 11:20:00]

    Вы также можете использовать цикл for и tr для извлечения имени файла из пути.

    Tr заменяет все/разделители в пути пробелами, поэтому делает список строк, а цикл for проверяет их, оставляя последнее в переменной имени файла.

    -2 Srikant [2014-07-30 11:11:00]

    Простой bash один вкладыш. Я использовал это, чтобы удалить расширение rst из всех файлов в pwd

    1) ls -1 *.rst отобразит все файлы на stdout в новой строке (попробуйте).

    2) echo $each | wc -c подсчитывает количество символов в каждом имени файла.

    3) echo $each | cut -c -$(( $a-5 )) выбирает до 4 символов, т.е. .rst .