12

Я ищу, чтобы получить список только имен файлов (без остальной части пути) при выполнении команды поиска из терминала. Как мне сделать это на Mac?

7 ответов7

16

С базовым именем:

find . -type f -exec basename {} \;

6

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

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
2

РЕДАКТИРОВАТЬ:

Используя sed:

$ find . -type f | sed 's/.*\///'

Использование команды xargs , как указано в ответе @nerdwaller

$ find . -type f -print0 | xargs --null -n1 basename
2

С помощью GNU find вы можете делать:

 find ~/tmp/ -printf "%f\n"

Это, вероятно, стоит попробовать и в OS X.

2

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

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

Мы ищем только файлы в ~/tmp и получаем список, в котором каждая запись отделена косой чертой. Следовательно, мы используем косую черту в качестве разделителя полей (-F/) и печатаем параметр поля ($ 1 .. $ 9), который соответствует последнему полю ($ NF).

1

Как насчет этого:

find … | egrep -o -e '[^/]+$'

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

0

Вы можете вызвать sh из опции find -exec и избегать использования ненужных каналов. Это также имеет то преимущество, что вам не нужно беспокоиться о смешных именах файлов (пробелы, переводы строки и т.д.):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;

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