Basename удаляет второй файл из моего списка 'find' в bash - PullRequest
0 голосов
/ 26 февраля 2019

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

gas$ ls -l
total 8
-rwxrwxrwx  1 gas  staff  54 Feb 26 19:00 find_sh.sh
-rw-r--r--  1 gas  staff   0 Feb 26 19:21 test-file.sh

gas$ find . -type f -name '*.sh'
./find_sh.sh
./test-file.sh

gas$ basename $(find . -type f -name '*.sh')
find_sh.sh

Добавление третьего файла, кажется, исправляет его длянеясная причина (см. ниже)

gas$ touch test-file2.sh
gas$ basename $(find . -type f -name '*.sh')
find_sh.sh
test-file.sh
test-file2.sh

Кто-нибудь знает, что происходит с базовым именем второго файла?Я без ума от того, что происходит не так.

Я нашел решение для угробления basename и просто использовал sed 's/.*\///', чтобы удалить путь в имени.

Так что даже если я найду решение, мне все равно интересно, что не так с basename, когда нужно отобразить два файла:)

Заранее спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Вам не нужно базовое имя вообще, функция find способна сама по себе:

find . -type f -name '*.sh' -printf '%f\n'

Причина, по которой форма аргумента basename с двумя аргументами не работает так, как вы ожидаете, заключается в том, что именно так2 аргумента формы базового имени работает.Со страницы man:

SYNOPSIS

базовое имя NAME [SUFFIX]
базовое имя OPTION ... NAME ...

Если не задано никаких опций, 2-й аргумент является суффиксом для удаления первого аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...