我试图简化我的工作与我的bash shell中的别名命令的帮助。
问题陈述:我想将不同目录下的不同文件复制到一个文件夹中。 我在这里使用的语法如下
cp <folder>/<file> <path>/file.dir
这里我想用filename.directory保存目标文件,以便于识别。 为了达到同样的效果,我写了下面的别名。
别名脚本
cp $Folder/$fileName ~/<path>/$fileName.$Folder
要么
cp $1/$2 ~/<path>/$2.$1
预期产出,
cp bin/file1 ~/Desktop/personal/file1.bin
cp etc/file2 ~/Desktop/personal/file2.etc*
但是,parsing源文件失败。 即$Folder
不会被我的第一个参数replace。
cp: cannot stat `/file1': No such file or directory
我只写上面的脚本来减less我的命令长度。 由于我不是上述代码的专家,所以寻求专家的帮助来解决这个问题。
您可以使用您在某个合适的位置定义的函数,而不是使用别名,例如.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 }
如你正在尝试的那样,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表达式。
这将大致像cp
一样工作,最后一个参数是目标dir:
myCp() { local dest="${@:$#}" file set -- "${@:1:$[$#-1]}" for file in "$@"; do cp -i "$file" "${dest%/}/${file##*/}.${file%%/*}" done }
可以这样使用:
myCp */* /path/to/destdir
为了测试这个,你可以通过echo "cp -i"
替换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