Як повернути лише імена файлів із команди find?


14

Я хочу отримати список тільки імен файлів (без решти шляху) під час виконання команди пошуку з терміналу. Як це зробити на mac?

Відповіді:


18

З базовою назвою:

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


Для чого потрібні фігурні брекети?
недійсний

basename запускається один раз для кожного знайденого файлу, позначається {}.
Ярослав Рахматуллін

що означає середнє значення \ і; ?
neouyghur

@neouyghur ;припиняє -execдію. \ Необхідно тому , що ;має особливе значення для оболонки.
8bittree

6

Евілсуп зазначив, що розміщене не працює для розміщених імен файлів. Тож замість цього ви можете використовувати:

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

Це порушить файли з пробілами в їхніх іменах (див. Розбір ls у greki's wiki)
evilsoup

+1 для швидкості. Я не знаю, чи зробив я щось не так, але цей час зайняв 1 секунду в моєму домі $ HOME, тоді як всі інші зайняли близько 10 секунд. Звичайно, мені знадобиться більше 10 секунд, щоб переглянути це і набрати його.
Пауло Альмейда

2

За допомогою пошуку GNU ви можете:

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

Це, мабуть, варто спробувати і в OS X.


2
-printfНе підтримується на BSD OS X в find.
Даніель Бек

1
Крім того, він -printfмало стосується C printfабо утиліти оболонки POSIX printf. Використання цієї назви історичної функції для чогось іншого дуже погано розглядається. Консервативні хлопці з BSD, ймовірно, бачать це так само, тому ми, мабуть, не будемо бачити клонів -printfу BSD-знахідці під цим іменем.
Каз

Я не погоджуюся, що погано вважається використання знайомої назви функції для виконання подібного завдання в іншому контексті. Чому BSD, ймовірно, ніколи не підтримає це інша справа.
Ярослав Рахматуллін

2

Є кращий спосіб зняти все, крім останньої частини шляху файлу; з awk. Це краще, тому що awk не виконується один раз для кожного файлу. У деяких випадках це має значення.

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

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


Це найшвидший тест.
Пауло Альмейда

Останнім часом я використовую Cygwin, і створити процес у Windows дуже дорого ...
Ярослав Рахматуллін

2

Редагувати :

Використання sed:

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

Використання команди xargs , як згадується у відповіді @nerdwaller

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

1
Дякую за те, що вказав, що +1, +1, я не дуже часто використовував xargs ... Безумовно, слід, оскільки ви скинули з моєї команди досить багато символів.
nerdwaller

Цей файл переривається, коли у файлах є пробіли. Це працює так, принаймні, у швидкому тесті:find . -type f -print0| xargs --null -n1 basename
Пауло Альмейда

Ні те, --nullні -n1варіанти є недоступними для OSX
Валерій Ван,

1

Як що до цього:

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

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


0

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

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.