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



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

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

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

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

  • bitcoin-wallet.dat
  • dogecoin-wallet.dat

等等

有简单的方法吗?

直接改编您的命令:

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

解释

  • 每个找到的文件将被设置为CCD_ 5的第0个位置自变量
  • 对于execdir,将从包含找到的文件的目录执行bash过程,因此$PWD将扩展到包含的目录
  • ${PWD##*/}扩展到当前目录,在删除了直到并包括最后一个斜杠的所有内容(因此,很可能是包含目录的基本名称)之后
  • ${0#./}扩展为删除句点和斜线后找到的文件名

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

这样就可以了。如果单词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

以下是使用tar执行类似操作的一种略有不同的方法:

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

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

请记住,这只会创建文件的单个副本,而不是一个具有多个时间点的备份,您可以在丢失时返回该备份。此外,如果您的文件已损坏,并且备份在损坏后但在您检测到之前运行,则备份将用损坏的副本覆盖您的好副本。。。因此,最好将日期放在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

最新更新