2016-03-14 3 views
0

Мне нужно создать список файлов в каталоге и во всех его подкаталогах. Я использовалСписок только имен файлов в каталогах и подкаталогах в bash

find . -type f 

, чтобы получить список файлов, но мне нужно только имя файла, а не путь, ведущий к нему.

Таким образом, вместо того, чтобы вернуться в следующем:

./temp2/temp3/file3.txt 
./temp2/file2.txt 
./file.txt 

Мне нужно вернуть

file3.txt 
file2.txt 
file.txt 
+0

Спасибо за быстрый ответ. Все они работали, поэтому я случайно выбрал лучший ответ. – TheRunner565

ответ

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

или еще лучше:

find . -type f -printf "%f\n" 
1
find . -type f | xargs basename 

Команда basename раздевает каталоги и выводит только имя файла. Используйте xargs для подключения вывода find к входу basename.

1

Вы можете использовать printf опцию гну find:

find . -type f -printf "%f\n" 

Для не гну find использования -execdir и printf:

find . -type f -execdir printf "%s\n" {} + 
+0

'-execdir' также является расширением GNU. – chepner

+0

На самом деле у меня это на моем BSD (OSX) 'find', но' printf' там нет – anubhava

+0

's/GNU //' :) Это не POSIX. – chepner

0

Поздний ответ :)

-printf "%f" является лучшим решением, но printf доступен только в GNU найти. Например, на OS X (и, вероятно, FreeBSD тоже) будет печатать:

find: -printf: unknown primary or operator 

для таких случаев, я предпочитаю следующие

find . -type f | sed 's:.*/::' 

Это быстрее (на больших деревьев), как мультипликатор basename выполнение.

Недостаток, он будет обрабатывать только имена файлов без \n (newline) в именах файлов. Для обработки таких случаев самый простой (и самый универсальный, но медленный) способ использует basename.

Вы также можете использовать Perl, как:

perl -MFile::Find -E 'find(sub{say if -f},".")' 
Смежные вопросы