我在bash中有一个函数可以删除路径的前两个目录。这很好用。我想添加一个新的开始路径的功能,但我遇到了问题。以下是我目前所拥有的:
function fp {
echo $1 | cut -d'/' -f4-
}
如果我这样调用函数:
fp 'dir1/dir2/dir3/file'
它返回"dir3/file1"。我现在需要它返回"dir5/dir6/dir3/file",如何在路径前面附加额外的目录?
更新:
该方法最初的目的是创建一个别名,如果更新的文件发生了更改,该别名将把更新的文件复制到git repo中。以下是现在有效的完整代码:
# 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#*/*/*/}"
}
您可以使用参数扩展:
function fp {
echo "dir5/dir6/${1#*/*/}"
}
您可以使用命令替换($(...)
),然后将其作为参数发送到printf
。还要记住变量替换周围的引号:echo "$1"
fp() {
printf "dir5/dir6/%sn" "$(printf "%sn" "$1" | cut -d'/' -f4-)"
}
我将function fp {
更改为POSIX函数定义fp() {
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/"
字符串串联可以像将不同的部分放在一起一样简单。您已经生成的路径端可以放在一个子shell($(...)
,或以前的"…")中,它本身可以包含在一个双引号字符串中,因此它将扩展到其输出中:
function fp {
echo "/dir5/dir6/$(echo "$1" | cut -d'/' -f4-)"
}
话虽如此,Casimir的答案的参数扩展将更有效,基于printf
的解决方案将更便携(也可以说更可读)。