0

此函数遍历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 位(文件夹名称_001,文件夹名称_002)?

我的第三个也是最后一个问题,目标应该只包含同名文件夹的备份,因此组中的最后一个文件夹应该具有最新(最高)的编号。如果由于某种原因文件夹没有排序,可以做些什么来保证找到最高数字?

4

1 回答 1

3

Bash 有一个printf函数,可以帮助您回答第二个问题。

如果您的 backupFolderNumber 是一个整数,您可以使用:

paddedFolderNumber=$(printf "%03d" $backupFolderNumber)

%03d 语法告诉 printf 将数字打印为至少三个字符长,如果backupFolderNumber的长度少于三个字符,则用零填充。

请注意,如果您的文件夹名称为 folder_name001 您当前的代码,

backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]')

将不再为您提供所需的结果,因为它将返回 ie 010,let 语句将认为它是 8 的八进制数,导致backupFolderNumber 变为9,而不是您想要的 11 或 011。

从当前文件夹名称中检索数字时,为您提供非填充数字的一种解决方案是:

backupFolderNumber=$(echo $currentFolder | tr -cd '[[:digit:]]' | sed -e 's/^0\{1,2\}//')

这里 sed 去掉 1 或 2 个前导零(这样序列 000 返回 0 而不是什么都没有),因此 let 应该期望十进制而不是八进制。

于 2012-09-12T17:04:13.110 回答