tR语言 cd '[[:d igit:]]' 仅提供一个数字



此函数循环浏览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/solderName_11。

我的第一个问题是,为什么它没有按照我想象的方式工作(创建folderName_11并计数)?

我的第二个问题是,如何将文件名格式化为包含前零,以使数字部分的长度为3位数(folderName_001,folderName/002)?

我的第三个也是最后一个问题,目标应该只包含相同名称下相同文件夹的备份,因此组中的最后一个文件夹应该具有最新(最高)编号。如果由于某种原因,文件夹排序不正确,该如何确保找到最高编号?

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

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

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

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

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

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

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

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

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

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

最新更新