Как получить только имя файла с linux 'find'?

Я использую find для всех файлов в каталоге, поэтому я получаю список путей. Однако, мне нужны только имена файлов. то есть я получаю ./dir1/dir2/file.txt и я хочу сделать file.txt

6 ответов


в GNU find можно использовать


Если у вашей находки нет опции-printf, вы также можете использовать basename:

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

Если вы используете GNU find

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

или вы можете использовать язык программирования, таких как Ruby(1.9+)

$ ruby -e 'Dir["**/*"].each{|x| puts File.basename(x)}'

Если вам нравится решение bash (по крайней мере 4)

shopt -s globstar
for file in **; do echo ${file##*/}; done

использовать -execdir, который автоматически закрывает текущий файл в {}, например:

find . -type f -execdir echo '{}' ';'

вы также можете использовать $PWD вместо . (в некоторых системах он не будет производить дополнительную точку спереди).

если у вас все еще есть дополнительная точка, в качестве альтернативы вы можете запустить:

find . -type f -execdir basename '{}' ';'

-execdir utility [argument ...] ;

на -execdir primary идентичен -exec primary за исключением этой утилиты будет выполняться из каталога, который закрывает текущий файл.

при использовании + вместо ;, потом {} заменяется как много путей, для каждого вызова утилиты. Другими словами, он будет печатать все имена файлов в одной строке.


если вы хотите выполнить какое-либо действие только против имени файла, используя basename может быть жестким.

например это:

find ~/clang+llvm-3.3/bin/ -type f -exec echo basename {} \; 

будет просто эхо basename /my/found/path. Не то, что мы хотим, если мы хотим выполнить с именем файла.

но вы можете тогда xargs выход. например, чтобы убить файлы в dir на основе имен в другом dir:

cd dirIwantToRMin;
find ~/clang+llvm-3.3/bin/ -type f -exec basename {} \; | xargs rm

Я нашел решение (на странице makandracards), которое дает только самое новое имя файла:

ls -1tr * | tail -1

(спасибо идет к Арне решается)

я использовал его для cp:

cp $(ls -1tr * | tail -1) /tmp/