Я ищу, чтобы получить список только имен файлов (без остальной части пути) при выполнении команды поиска из терминала. Как мне сделать это на 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 '[^/]+$'
Преимущество: создается только один дополнительный процесс, а не один для каждого результата.