2014-10-13 3 views
0

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 

(Не стройте никаких предположений о текущей дате в обрезного код пути.)

+3

Возможно, это может помочь вам: http://stackoverflow.com/questions/2564634/bash-convert-absolute-path -into-relative-path-given-a-current-directory – aioobe

+0

вы просто хотите удалить «/ home/test» или вот какая-то другая логика, о которой вы забыли рассказать? – jm666

+1

Как вы определяете, что нужно обрезать с самого начала имени? Это значение в '$ ydk' или' $ HOME' или что-то еще? –

ответ

4

Если вам нужна последняя четыре компоненты каталога на полном пути, и если вы не У вас есть новые строки в полном пути, и если у вас есть 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]/.*$' 

Это гораздо проще; для этого вам даже не нужны расширенные регулярные выражения!

Если вам нужен элемент пути до года тоже, то вам необходимо:

echo "{fullpath%/*}" | grep -o -e '/[^/][^/]*/201[0-9]/.*$' 
+0

Спасибо, что это работа, но теперь у меня есть новая проблема. Иногда мне нужны последние четыре каталога, а иногда и больше, а не статические. Но 2014/.... статический путь. Итак, как я могу обрезать, если см./201 ->/2014/..... – phe

+0

Внимательно объясните свои требования. Вам нужен путь, начинающийся с '/ 201 [0-9] /'? Вам нужен элемент до этого и 201x и 2 элемента после него? Если вы не можете точно объяснить, что вам нужно, тогда (1) вы не можете реализовать то, что вам нужно, потому что вы не знаете, и (2) мы не можем вам помочь, потому что мы тоже не знаем. –

+0

Мне нужно начало пути/201 [0-9]:/home/bla/bla2/bla3/2014/01/13/13 ... ->/2014/01/13/13 .... Извините за мой английский , – phe

0

ли вам действительно нужно удалить «/ 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 
+0

Выглядит как '$ {dir # $ ydk}' больше того, что есть после OP. Хотя это не очень понятно. –

+0

Желаемый результат кажется отсутствующим '/ home/test' с фронта (только один'/test' на выходе) и 'log.file' с конца. Это фрагмент пути, но основа для измельчения переднего пути неясна. Непонятно, почему вы не использовали '$ {cek%/*}' вместо '$ (dirname" $ ​​cek ")'. –

+0

Спасибо, что это работа. Если у меня более 1 домашняя папка, иногда бывает 1 домашняя или тестовая папка, иногда 2-3 папки. Как я могу обрезать just/test/2014/10/13 /? Среднее просто последнее 3 или 4 пути папки. – phe

Смежные вопросы