11

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

find trunk/messages/ -name "*.po" -printf '%f\n'

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

РЕДАКТИРОВАТЬ: И, если возможно, только имя, исключая расширение.

3 ответа3

18

Используйте find trunk/messages/ -name "*.po" -exec basename {} .po \;

Пример и пояснения:

Создайте несколько тестовых файлов:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

Хорошо, файлы найдены, включая путь.

Для каждого результата выполните basename и удалите часть .po имени

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2
4

Вы можете использовать параметр -execdir который будет печатать файл без пути, например:

find . -name "*.po" -execdir echo {} ';'

Файлы без расширений:

find . -name "*.txt" -execdir basename {} .po ';'

Примечание: поскольку это не POSIX, BSD find выведет чистые имена файлов, однако использование GNU find выведет дополнительные ./ .

См .: Почему команда GNU find -execdir ведет себя иначе, чем команда BSD find?

1

Основываясь на команде, которую я нашел здесь: http://www.unixcl.com/2009/08/remove-path-from-find-result-in-bash.html

Вы можете сделать это, используя sed (который выполняется для меня быстрее, чем подход с basename ):

find trunk/messages/ -name "*.po" | sed 's!.*/!!' | sed 's!.po!!'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .