2012-09-12 34 views
0

该函数循环遍历destinationDirectory中的文件夹名称,以找到文件名末尾的最大数值,递增该值并将该值附加到folderNameWithoutNumber的结尾。或者我认为会。 bash的功能:tr -cd'[[:digit:]]'只提供一个数字

$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次,一切似乎都做工精细,在我得到的/路径的形式创建的前十个备份/到/备份/ 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

作为一个开始在shebang中添加'-x'来启用调试打印输出。然后你会看到为什么问题1失败 –

+0

@Fredrik感谢您的意见。不幸的是,我的4小时bash教育留下了很多待发现。你能详细说明在哪里放置-x标志吗? –

+0

'#!/ bin/bash -x'请参阅wikipedia以获取[shebang]的解释(http://en.wikipedia.org/wiki/Shebang_(Unix)) –

回答

3

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

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

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

的%03D语法告诉printf的打印数量为长至少三个字符,用0填充如果backupFolderNumber是较少然后三个字符的长度。

请注意,如果你有形式folder_name001当前的代码名称的文件夹,

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

将不再给你想要的结果,因为它会返回,即010其中let语句会认为是八进制为8,导致backupFolderNumber成为9,而不是11或011,你会想要的。

一个解决方案获取当前文件夹的名称数量时,给你非补齐号码是:

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

这里SED条客场1或2个前导零(这样的序列000返回0不什么也没有),因此让我们期待一个十进制不是八进制。

+0

backupFolderNumber = $(echo $ currentFolder | tr -cd'[[:digit:]]'| sed -e's/^ 0 \ {1,2 \} //')正是我在寻找的,谢谢您。 –