Я ищу, чтобы получить список только имен файлов (без остальной части пути) при выполнении команды поиска из терминала. Как мне сделать это на Mac?
7 ответов
С базовым именем:
find . -type f -exec basename {} \;
Evilsoup упомянул, что то, что было опубликовано, не работает для имен файлов с интервалом. Так что вместо этого вы можете использовать:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
РЕДАКТИРОВАТЬ:
Используя sed
:
$ find . -type f | sed 's/.*\///'
Использование команды xargs , как указано в ответе @nerdwaller
$ find . -type f -print0 | xargs --null -n1 basename
С помощью GNU find вы можете делать:
find ~/tmp/ -printf "%f\n"
Это, вероятно, стоит попробовать и в OS X.
Есть лучший способ удалить все, кроме последней части пути к файлу; с awk. Это лучше, потому что awk не выполняется один раз для каждого файла. В некоторых случаях это имеет значение.
find ~/tmp/ -type f | awk -F/ '{ print $NF }'
Мы ищем только файлы в ~/tmp и получаем список, в котором каждая запись отделена косой чертой. Следовательно, мы используем косую черту в качестве разделителя полей (-F/) и печатаем параметр поля ($ 1 .. $ 9), который соответствует последнему полю ($ NF).
Как насчет этого:
find … | egrep -o -e '[^/]+$'
Преимущество: создается только один дополнительный процесс, а не один для каждого результата.
Вы можете вызвать sh
из опции find -exec
и избегать использования ненужных каналов. Это также имеет то преимущество, что вам не нужно беспокоиться о смешных именах файлов (пробелы, переводы строки и т.д.):
find . -type f -exec sh -c 'echo "${0##*/}"' {} \;