我正在尝试使用bash shell中的Alias命令来简化我的工作。
问题陈述: 我想将不同目录中的不同文件复制到一个文件夹中。我在这里使用的语法如下所示
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*
然而,它解析源文件失败了。即$Folder
不会被我的第一个论点所取代。
cp: cannot stat `/file1': No such file or directory
我正在编写上面的脚本只是为了减少命令长度。由于我不是上述代码的专家,因此寻求任何专家帮助来解决问题。
答案 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)
这将大约像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目录:)