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