去年七月,我写了一篇关于 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 条评论