我使用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
(不要在今天的路径修剪代码中建立任何关于今天的假设。)
答案 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