备份特定文件并通过Bash重命名

时间:2014-04-18 11:20:14

标签: bash find backup exec bitcoin

我想使用bash为我的CryptoCurrency Wallets创建一个备份脚本。所有钱包都在/home的子文件夹中。

find /root/ -name 'wallet.dat' -exec cp {} /home/backup \;

此命令复制文件;但是,我想做以下事情:

钱包总是这样的结构:/home/<coinname>/.<coinname>/wallet.dat。 我希望将备份文件命名为<coinname>-wallet.dat,以便文件夹/home/backup 有以下文件:

  • 比特币-的wallet.dat
  • 多吉币-的wallet.dat

等等。

有一种简单的方法吗?

3 个答案:

答案 0 :(得分:0)

这应该这样做。如果它看起来像你想要的那样,请删除单词echo

#!/bin/bash
find . -name wallet.dat | while read x
do
   original="$x"
   # Strip filename off right end
   x=${x%/wallet.dat}
   # Strip all but last directory off left end
   x=${x##*/}
   newname="/home/backup/${x}-wallet.dat"
   echo cp "$original" "$newname"
done

将上面的文件保存为BackupWallets并执行此操作以运行它:

chmod +x BackupWallets
./BackupWallets

答案 1 :(得分:0)

以下使用tar执行类似操作的方式略有不同:

find /root -name wallet.dat -print | tar -cv -T - -f /home/backup/wallets.tar

它使用find查找名为wallet.dat的所有文件,并将它们发送到tar,以便复制到/ home / backup中的tar文件中。

请记住,这只会创建一个文件的副本,而不是具有多个时间点的备份,以便在丢失的情况下返回 - 如果您的文件损坏并且您的备份在损坏后运行但是在你检测到它之前,你的备份会用损坏的副本覆盖你的好副本......所以最好把日期放在tarfile名称中,这样你每次都会得到一个新的,比如:

find /root -name wallet.dat -print | tar -cv -T - -f "/home/backup/$(date +'%Y-%m-%d')_wallets.tar"

然后您每天运行一个新文件,例如/home/backup/2014-04-18_wallets.tar

答案 2 :(得分:0)

直接调整你的命令:

find /root/ -name 'wallet.dat' -execdir bash -c 'echo cp "$0" "/home/backup/${PWD##*/}-${0#\./}"' {} \;

<强>解释

  • 每个找到的文件将被设置为bash
  • 的第0个位置参数
  • 使用execdirbash进程将从包含找到的文件的目录执行,因此$PWD将扩展到包含目录,
  • ${PWD##*/}在删除所有内容之后扩展到当前目录,包括最后一个斜杠(很可能是包含目录的基本名称),
  • ${0#./}扩展为删除句点和斜杠后找到的文件的名称。

如果您对此感到满意,请移除echo

相关问题