Readlink - Как обрезать полный путь?
Я использую readlink
чтобы найти полный путь к файлу:
cek=$(readlink -f "$1")
mkdir -p "$ydk$cek"
mv "$1" "$ydk/$cek/$ydkfile"
Но readlink -f "$1"
дает мне полный путь. Как я могу обрезать полный путь?
Например:
/home/test/test/2014/10/13/log.file
Но мне нужно просто
/test/2014/10/13/
Как мне это сделать?
Судя по многочисленным комментариям:
- Выходными данными должны быть последние четыре компонента каталога полного пути, возвращаемого
readlink
,
Дано:
full_path=/home/some/where/hidden/test/2014/08/29/sparefile.log
вывод должен быть:
test/2014/08/29
(Не включайте никаких предположений о сегодняшней дате в код обрезки пути.)
2 ответа
Если вам нужны последние четыре компонента каталога полного пути, и если у вас нет новых строк в полном пути, и если у вас есть GNU grep
или BSD (Mac OS X) grep
с поддержкой -o
(выводить только соответствующий материал), тогда это дает требуемый результат:
$ cek="/home/test/test/2014/10/13/log.file"
$ echo "${cek%/*}"
/home/test/test/2014/10/13
$ echo "${cek%/*}" | grep -o -E -e '(/[^/]+){4}$'
/test/2014/10/13
$ full_path=/home/some/where/hidden/test/2014/08/29/sparefile.log
$ echo "${full_path%/*}" | grep -o -E -e '(/[^/]+){4}$'
/test/2014/08/29
$
Мне нужно начать путь
/201[0-9]
:
/home/bla/bla2/bla3/2014/01/13/13…
⟶/2014/01/13/13…
,
Итак, вам нужно использовать grep -o
опять же, начиная с года:
echo "${fullpath%/*}" | grep -o -e '/201[0-9]/.*$'
Это намного проще; вам даже не нужны расширенные регулярные выражения для этого!
Если вам нужен элемент path до года, то вам нужно:
echo "{fullpath%/*}" | grep -o -e '/[^/][^/]*/201[0-9]/.*$'
Вам действительно нужно удалить "/home"?
cek="/home/test/test/2014/10/13/log.file"
dir=$(dirname "$cek")
echo "${dir#/home}"
/test/test/2014/10/13
Всего 4 последних компонента каталога:
last4dirs() {
local IFS=/
local -a components=($1)
local l=${#components[@]}
echo "${components[*]:l-5:4}"
}
last4dirs /home/some/where/hidden/test/2014/08/29/sparefile.log
test/2014/08/29