去年 7 月,我写了关于 cp 命令的两个妙用:备份文件和同步文件夹的辅助副本。
在发现了这些强大的实用程序后,我发现它们比必要的更冗长,因此我在 Bash shell 启动脚本中为它们创建了快捷方式。我想分享这些快捷方式,以防它们对其他人有用,或者可以为那些尚未完全接受别名或 shell 函数的 Bash 用户提供灵感。
更新文件夹的第二个副本——Bash 别名
使用 cp
更新文件夹的第二个副本的一般模式是
cp -r -u -v SOURCE-FOLDER DESTINATION-DIRECTORY
其中 -r
代表“递归地遍历文件夹,访问所有文件”,-u
代表“更新目标”,-v
代表“详细模式”,SOURCE-FOLDER
是包含最新信息的文件夹的名称,而 DESTINATION-DIRECTORY
是包含 SOURCE-FOLDER
副本的目录,该副本必须同步。
我可以很容易地记住 -r
选项,因为我在四处复制文件夹时经常使用它。我可能可以再花一些力气记住 -v
,再花更多力气记住 -u
(是“更新”还是“同步”还是……)。
或者我可以使用 Bash 中的别名功能 将 cp
命令和选项转换为更易于记忆的东西,例如这样
alias sync='cp -r -u -v'
如果我将其保存在我的主目录中的 .bash_aliases
文件中,然后启动一个新的终端会话,我可以使用别名,例如
sync Pictures /media/me/4388-E5FE
将我的主目录中的 Pictures 文件夹与我的 USB 驱动器中的相同版本同步。
不确定是否已定义 sync
别名?您可以通过在终端窗口的命令提示符下键入单词 alias
来列出所有当前定义的别名。
非常喜欢这样以至于想立即开始使用它?打开终端窗口并键入
echo "alias sync='cp -r -u -v'" >> ~/.bash_aliases
然后启动一个新的终端窗口并在命令提示符下键入单词 alias
。您应该看到类似这样的内容
me@mymachine~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias gvm='sdk'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias sync='cp -r -u -v'
me@mymachine:~$
您可以在那里看到定义的 sync
别名。
制作版本化备份——Bash 函数
使用 cp
备份文件的一般模式是
cp --force --backup=numbered WORKING-FILE BACKED-UP-FILE
其中 -- force
代表“无论如何都进行复制”,-- backup=numbered
代表“使用数字来指示备份的代数”,WORKING-FILE
是我们希望保留的当前文件,而 BACKED-UP-FILE
与 WORKING-FILE
同名,并将附加代数信息。
除了记住 cp
命令的选项外,我们还需要记住第二次重复 WORKING-FILE
名称。但是,当 Bash 函数 可以为我们处理这种开销时,为什么要重复自己呢,就像这样
同样,您可以将其保存到您的主目录中的 .bash_aliases
文件中。
function backup {
if [ $# -ne 1 ]; then
echo "Usage: $0 filename"
elif [ -f $1 ] ; then
echo "cp --force --backup=numbered $1 $1"
cp --force --backup=numbered $1 $1
else
echo "$0: $1 is not a file"
fi
}
我将此函数称为“backup”,因为我的系统上没有任何其他名为“backup”的命令,但您可以选择任何适合的名称。
第一个 if
语句检查以确保仅向该函数提供一个参数,否则使用 echo
命令打印正确用法。
elif
语句检查以确保提供的参数是一个文件,如果是,则它(详细地)使用第二个 echo
打印要使用的 cp
命令,然后执行它。
如果单个参数不是文件,则第三个 echo
打印一条错误消息,说明该效果。
在我的主目录中,如果我对文件 checkCounts.sql
执行如此定义的 backup
命令,我看到 backup
创建了一个名为 checkCounts.sql.~1~
的文件。如果我再次执行它,我看到一个新文件 checkCounts.sql.~2~
。
成功!正如计划的那样,我可以继续编辑 checkCounts.sql
,但是如果我每隔一段时间使用 backup 对其进行快照,如果我遇到麻烦,我可以返回到最新的快照。
在某些时候,最好开始使用 git
进行版本控制,但是当您需要创建快照但尚未准备好使用 git
时,上面定义的 backup
是一个不错的廉价工具。
结论
在我上一篇文章中,我向您保证,重复性任务通常可以通过使用 shell 脚本、shell 函数和 shell 别名轻松简化。
在这里,我展示了使用 shell 别名和 shell 函数来简化 cp
命令的同步和备份功能的具体示例。如果您想了解更多相关信息,请查看上面引用的两篇文章:如何使用别名在命令行上节省击键次数 和 Shell 脚本编写:shift 方法和自定义函数简介,分别由我的同事 Greg 和 Seth 撰写。
8 条评论