cp 命令的两个绝佳用途:Bash 快捷方式

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

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

去年七月,我写了一篇关于 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 (未验证)

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.