我在bash中有一个函数来删除路径的前两个目录。这很好用。我想补充一下,添加新的起始路径的能力,我遇到了问题。以下是我到目前为止的情况:
function fp {
echo $1 | cut -d'/' -f4-
}
如果我这样调用函数:
fp 'dir1/dir2/dir3/file'
返回'dir3 / file1'。我现在需要它返回'dir5 / dir6 / dir3 / file',如何在路径前追加其他目录?
更新:
该方法的最初目的是创建一个别名,如果已更改,则将更新的文件复制到git仓库中。以下是现在可以使用的完整代码:
# Update dotfiles if there are any changes
alias dotu='for file in $(diff -qr ./ ~/ | grep differ | cut -d " " -f; do eval $(fp "$file"); echo "$file"; done'
function fp {
printf "%s%s" "cp $1 ~/dotfiles/" $(echo $1 | cut -d'/' -f4-)
}
不是那么擅长bash,这可能很丑,但它对我有用。
更新#2:
好的,这就是我最终得到的,让函数自己复制:
# Update dotfiles if there are any changes
alias dotu='for file in $(diff -qr ./ ~/ | grep differ | cut -d " " -f; do fp "$file"; echo "$file"; done'
function fp {
cp $1 ~/dotfiles/${1#*/*/*/}
}
更新#3:
再一次,希望现在好了。
# Update dotfiles if there are any changes
alias dotu='for file in $(diff -qr ./ ~/ | grep differ | cut -d " " -f; do fp "$file"; echo "$file"; done'
function fp {
cp "$1" ~/dotfiles/"${1#*/*/*/}"
}
答案 0 :(得分:6)
您可以使用参数扩展:
function fp {
echo "dir5/dir6/${1#*/*/}"
}
答案 1 :(得分:2)
您可以使用命令替换($(...)
),然后将其作为参数发送到printf
。还要记住变量替换的引用:echo "$1"
fp() {
printf "dir5/dir6/%s\n" "$(printf "%s\n" "$1" | cut -d'/' -f4-)"
}
我将function fp {
更改为POSIX函数定义fp() {
答案 2 :(得分:1)
function fp {
printf "%s%s" "/dev5/dir6/" "$(echo "$1" | cut -d'/' -f4-)"
}
会这样做。你也可以这样做:
function fp {
printf "%s%s" "$2" "$(echo "$1" | cut -d'/' -f4-)"
}
其中$2
是要追加的路径:
调用函数
fp "dir1/dir2/dir3/file" "/dir5/dir6/"
答案 3 :(得分:0)
字符串连接可以像将不同部分放在一起一样简单。您已经生成的路径末尾可以放在子shell($(...)
或以前的`...`)中,它本身可以包含在双引号字符串中,因此它将扩展为其输出:
function fp {
echo "/dir5/dir6/$(echo "$1" | cut -d'/' -f4-)"
}
话虽这么说,Casimir的答案参数扩展会更有效率,基于printf
的解决方案将使我更具可移植性(以及更具可读性)。