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

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

Ответ 1

В GNU find вы можете использовать параметр -printf для этого, например:

find /dir1 -type f -printf "%f\n"

Ответ 2

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

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

Ответ 3

Если вы используете 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

Ответ 4

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

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

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

-execdir utility [argument ...] ;

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

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

Ответ 5

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

Например:

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

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

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

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

Ответ 6

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

ls -1tr * | tail -1

(спасибо Арне Хартхерц)

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

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