Как получить только имена из команды поиска без пути

14

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

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

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

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

вставай
источник

Ответы:

20

использование 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
Hennes
источник
Большое спасибо :). Могу ли я удалить только расширение PO из директорий? Я имею в виду: dir1 / po1.po и dir2 / po2.po их можно получить как dir1 / po1 и dir2 / po2?
пробуждение
@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck
@ спасибо, спасибо. наконец, мне нужно получить имя файла без расширения и последнюю папку, в которой оно находится: например, dir1 / subdir1 / subsubdir1 / po1.po и dir2 / subdir2 / subsubdir2 / po2.po должны быть установлены в переменную типа: subsubdir1 / po1 subsubdir2 / po2 соответственно.
пробуждение
@ user1754665 Хм, может бытьfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck
@Hennes Какова цель обратной косой черты перед открывающей фигурной скобкой в ​​последнем find?
Утку
3

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

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

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

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

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

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

kenorb
источник