Я хочу отримати список тільки імен файлів (без решти шляху) під час виконання команди пошуку з терміналу. Як це зробити на mac?
Я хочу отримати список тільки імен файлів (без решти шляху) під час виконання команди пошуку з терміналу. Як це зробити на mac?
Відповіді:
З базовою назвою:
find . -type f -exec basename {} \;
;
припиняє -exec
дію. \
Необхідно тому , що ;
має особливе значення для оболонки.
Евілсуп зазначив, що розміщене не працює для розміщених імен файлів. Тож замість цього ви можете використовувати:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
За допомогою пошуку GNU ви можете:
find ~/tmp/ -printf "%f\n"
Це, мабуть, варто спробувати і в OS X.
-printf
Не підтримується на BSD OS X в find
.
-printf
мало стосується C printf
або утиліти оболонки 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 '[^/]+$'
Перевага: Породжується лише один додатковий процес, а не один для кожного результату.