此函数循环遍历destinationDirectory中的文件夹名称,以查找文件名末尾的最高数值,递增该值,并将值附加到folderNameWithoutNumber的末尾。或者我认为会。 bash函数:
$backupFolderNumber=0
$1=$sourceDirectory
$2=$destinationDirectory
$3=$folderNameWithoutNumber
# The values when the function are called
backupDirectory() {
for currentFolder in $2/*
do
backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]')
done
let backupFolderNumber+=1
cp -r $1 $2/$3$backupFolderNumber
echo "Backup complete."
}
当前10次调用此函数时,一切似乎都运行正常,因为我得到以/ path / to / backups / folderName_1,/ path / to / backups / folderName_2的形式创建的前十个备份, ... / path / to / backups / folderName_10。再次调用该函数时,不会创建/ path / to / backups / folderName_11。
我的第一个问题是为什么这不符合我的想法(创建folderName_11并计算)?
我的第二个问题是如何格式化文件名以包含前面的零以使数字部分长3位(folderName_001,folderName_002)?
我的第三个也是最后一个问题,目标应该只包含相同名称下同一文件夹的备份,因此组中的最后一个文件夹应该具有最新(最高)的数字。如果由于某种原因文件夹没有按顺序排列,可以采取哪些措施来保证最高编号?
答案 0 :(得分:3)
Bash有一个 printf 功能,可以帮助您回答第二个问题。
如果您的backupFolderNumber是一个整数,您可以使用:
paddedFolderNumber=$(printf "%03d" $backupFolderNumber)
%03d语法告诉printf将数字打印为至少三个字符长,如果 backupFolderNumber 少于三个字符,则用零填充。
请注意,如果您的文件夹名称为folder_name001,则为当前代码
backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]')
将不再为您提供所需的结果,因为它将返回ie,其中let语句将认为8是八进制,导致 backupFolderNumber 成为9,而不是11或011,如您所愿
从当前文件夹名称中检索号码时,为您提供非填充号码的一种解决方案是:
backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]' | sed -e 's/^0\{1,2\}//')
这里sed剥去1或2个前导零(这样序列000返回0并不是什么),因此我们应该期望小数不是八进制。