Unix Bash别名命令

时间:2015-04-13 05:53:33

标签: bash unix alias

我正在尝试使用bash shell中的Alias命令来简化我的工作。

问题陈述: 我想将不同目录中的不同文件复制到一个文件夹中。我在这里使用的语法如下所示

cp <folder>/<file>    <path>/file.dir

这里我想用filename.directory保存目标文件以便于识别。为了达到同样的目的,我写了下面的别名。

别名脚本

cp $Folder/$fileName ~/<path>/$fileName.$Folder

cp $1/$2 ~/<path>/$2.$1

预期输出

  1. cp bin/file1 ~/Desktop/personal/file1.bin
  2. cp etc/file2 ~/Desktop/personal/file2.etc*
  3. 然而,它解析源文件失败了。即$Folder不会被我的第一个论点所取代。

    cp: cannot stat `/file1': No such file or directory
    

    我正在编写上面的脚本只是为了减少命令长度。由于我不是上述代码的专家,因此寻求任何专家帮助来解决问题。

4 个答案:

答案 0 :(得分:1)

您可以使用在某个合适位置定义的函数,例如.profile或.bashrc

,而不是使用别名。

例如:

mycp()
{
   folder=$1
   filename=$2

   if [ $# -ne 2 ]
   then
       echo "Two parameters not entered"
       return
   fi

   if  [ -d $folder -a -r $folder/$filename ]
   then
      cp $folder/$filename ~/playpen/$filename.$folder
   else
      echo "Invalid parameter"
   fi
}

答案 1 :(得分:0)

bash alias无法像你想要的那样使用参数。但是,基于perl的rename可能对您有所帮助。请注意,它会有效mv个文件,而不是cp个文件。

rename 's|([^/]*)/(.*)|/home/user/path/$2.$1|' */*

限制:您只能处理1个子目录级别的文件。

因此,下面的别名可以起作用(有上述限制):

$ alias backupfiles="rename 's|([^/]*)/(.*)|/home/user/path/\$2.\$1|'"
$ backupfiles */*

如果要使用多目录级文件结构,可以制作更复杂的perl表达式。

答案 2 :(得分:0)

YAMC:还有另一个 myCp

这将大约像cp,因为最后一个参数是目标目录:

myCp() { 
    local dest="${@:$#}" file
    set -- "${@:1:$[$#-1]}"
    for file in "$@"; do
        cp -i "$file" "${dest%/}/${file##*/}.${file%%/*}"
    done
}

可以这样使用:

myCp */* /path/to/destdir

要对此进行测试,您可以将cp -i替换为echo "cp -i"

更复杂的“myCp

myCp() { 
    local OPTIND=0_opt cpopt dest="" dbgcmd='' file name base
    while getopts "ialdt:" opt; do
        case $opt in 
            a | i | l ) cpopt+=$opt    ;; # Forward [i|a|l] option to cp
            d )         dbgcmd='echo'  ;; # Debug option
            t )         dest="$OPTARG" ;; # Target directory
            * )         echo "Syntax error:" 1>&2; return ;;
        esac
    done
    shift $[OPTIND-1]
    [ -z "$dest" ] && dest="${@:$#}" && set -- "${@:1:$[$#-1]}"
    for file in "$@"; do
        name="${file##*/}" base="${file%/*}"
        $dbgcmd cp ${cpopt+-}$cpopt "$file" "${dest%/}/$name.${base##*/}"
    done
}

这将源路径中的最后一个目录作为扩展名来复制文件

-d选项不复制任何内容,但显示结果命令:

myCp -dait /tmp/dedup /tmp/so/*/*
cp -ai /tmp/so/abc/lock /tmp/dedup/lock.abc
cp -ai /tmp/so/config/folder1 /tmp/dedup/folder1.config
cp -ai /tmp/so/config/folder2 /tmp/dedup/folder2.config
cp -ai /tmp/so/config/somefile1 /tmp/dedup/somefile1.config

myCp -dl /tmp/so/*/* /tmp/dedup/
cp -l /tmp/so/abc/lock /tmp/dedup/lock.abc
cp -l /tmp/so/config/folder1 /tmp/dedup/folder1.config
cp -l /tmp/so/config/folder2 /tmp/dedup/folder2.config
cp -l /tmp/so/config/somefile1 /tmp/dedup/somefile1.config

答案 3 :(得分:0)

目录包含一些文件,例如〜/ Documents / file1.d包含newfile.txt

build

在.bashrc中添加变量“文件”,例如,此处显示我的.bashrc

joe@indiana:~/Documents$ ls -l $file
total 1
-rw-r--r--   1 joe      staff          0 May  5 11:39 newfile.txt

现在,每当您复制到'$ file'时,它将复制到〜/ Documents下的file1.d目录:)