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