Readlink - 如何裁剪完整路径?

时间:2014-10-13 14:00:38

标签: bash 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 个答案:

答案 0 :(得分:4)

如果您需要完整路径的最后四个目录组件,并且您没有完整路径中的换行符,并且您有GNU grep或BSD(Mac OS X){{ 1}}支持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]/.*$'

答案 1 :(得分: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