我想使用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