Я использую find для всех файлов в каталоге, поэтому я получаю список путей. Однако мне нужны только имена файлов. то есть я получаю ./dir1/dir2/file.txt
, и я хочу получить file.txt
Как получить имя файла только с помощью linux `find`?
Ответ 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/