创建函数以返回BASH中的更新路径



我在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的解决方案将更便携(也可以说更可读)。

最新更新