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



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

795   6  

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)}'

Если вы представляете себе Баш (по крайней мере 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 ...] ;

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

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

если вы хотите выполнить какое-либо действие только с именем файла, используя 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/

Comments

    Ничего не найдено.