cp 命令的两个妙用:Bash 快捷方式

以下是如何简化 cp 命令的备份和同步功能。
256 位读者喜欢这个。
Why the operating system matters even more in 2017

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

去年 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-FILEWORKING-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 撰写。

标签
Chris Hermansen portrait Temuco Chile
自从 1978 年毕业于不列颠哥伦比亚大学以来,我就一直与某种计算机形影不离,自 2005 年以来一直是全职 Linux 用户,1986 年至 2005 年一直是全职 Solaris 和 SunOS 用户,在那之前是 UNIX System V 用户。

8 条评论

我认为“sync”不是别名的好名称 - sync (/bin/sync) 是一个将磁盘上的数据与内存同步的程序。

感谢您的评论,Artur,好观点!我一路走来把它叫做许多其他东西。可能也应该更改这个。

回复 作者:Artur (未验证)

我认为您还应该考虑使用“cp -av”。这保留了诸如时间戳之类的东西,当我寻找一段时间前制作的某个文件时,我经常使用它,并且制作时间有助于我找到它。“cp -ruv”将创建一个带有全新时间戳的副本。

感谢这篇帖子!我不知道“cp”有这种能力。GUI 通常让我有点远离终端。此外,我发现使用图形文件管理器更容易。

这些示例(以及自从过渡到 Linux 以来我收集的其他一些示例)是打开终端的绝佳理由!

我对 Greg Pittman 关于时间戳的贡献感到好奇。他似乎提出了一个很好的观点,如果是这样……也许可以编辑文章来解决这个问题(?)。

感谢您的评论,john379。很高兴听到人们发现有用的东西。

我喜欢 Greg 的想法。下次我重温这篇文章时,我一定会添加它!

回复 作者:john379 (未验证)

感谢您的评论,tatethurston。

我喜欢大括号的用法!我不得不说我在 SunOS 和 Solaris 中使用 c-shell 多年,但这个用法从未出现在我的脑海中。

回复 作者:tatethurston (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.