LINUX.ORG.RU

bash вычленить имя файла из полного пути

 ,


0

1

Всем привет! Есть текстовый файл, вида:

path/to/file/one.sql
path/to/next/file.sql
Его нужно прогрепать и выдать имена файлов, без пути к ним. Т.е. в данном случае one.sql и file.sql Как это сделать? Я пытался так:
grep -E 'path' text_file | cut -d '/' -f4
Но глубина путей может быть разная, значит вместо f4 может быть f5 или f6 или что угодно. Как победить? В голову приходила только мысль сделать цикл с обратным остчётом, чтобы он подставлял f99-f1 до тех пор, пока вся эта конструкция выдаёт нулевое значение, а как только ненулевое-завершить. Но как реализовать такое на практике? Я знаю только seq, но это же не то...

★★★★★

while read A; do echo ${A##*/}; done
vel ★★★★★
()
$ basename /etc/inittab 
inittab
imb ★★
()

man basename

anonymous
()
Ответ на: комментарий от anonymous

выглядело бы более наглядно с cat в начале

anonymous
()
Ответ на: комментарий от anonymous

О человечество! Это прекрасно! Всем огромное спасибо, тему можно считать решённой!

Pyzia ★★★★★
() автор топика
Ответ на: комментарий от aol

закон топикстартера: из 64 предложеных решений будет скрупулёзно выбрано самое вот такое

anonymous
()
Ответ на: комментарий от aol

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

bash вычленить имя файла из полного пути (комментарий)

linux-101
()
Ответ на: комментарий от aol

На самом деле, я не знаю, что правильнее выбрать, поэтому выбрал то, что мне проще понять. Попробую варианты с седом и бэйснеймом и решу.

Pyzia ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Ни разу не граммарнаци, но 3 ошибки в одном слове, даже для меня пребор. Марш учить уроки, сучка!

anonymous
()
Ответ на: комментарий от Stil

сомневаюсь, что он осилит ответить, потому вот:

$ grep -Po 'path.+?\K[^/]+$' <<EOF
> path/to/file/one.sql
> path/to/next/file.sql
> ass/to/next/file.sql
> EOF
one.sql
file.sql

anonymous
()
Ответ на: комментарий от linux-101

Это очень юниксвейно, да, на каждый возможный случай — своя утилита. Вот за это я и ненавижу linux.

а я ненавижу из-за таких как ты пионеров, которые велосипеды придумывают типа sed 's|.*/\([^/]*\)$|\1|'

emulek
()
Ответ на: комментарий от linux-101

Это очень юниксвейно, да, на каждый возможный случай — своя утилита.

Так чё сидишь. Иди проси, чтобы в МС Офис добавили кнопку для определения имени файла. «Один комбайн, чтобы править всеми!»

odii
()
Ответ на: комментарий от emulek
grep -o '[^/]*$' <<<"/path/to/file1
/path/to/another/file
this/is/path/too"

grep ничуть не лучше sed'а, но уж если использовать его, то хотя бы так.

DRVTiny ★★★★★
()
Ответ на: комментарий от Lavos

Подсказка: basename входит в coreutils, а sed - отдельный пакет.

я знаю. Потому и надо юзать basename, а не скрипт для sed.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.