2015-01-20 48 views
0

声明:我对Bash脚本编程(以及一般的Linux)非常陌生,所以请原谅我一个愚蠢的问题。在Bash中处理目录名称中的空格

我的一位朋友给了我一个脚本,将某些文件备份到Dropbox上。代码如下:

#!/bin/sh 
DATE=`date +%Y-%m-%d` 
tarname='backup-'$DATE'.tar.gz' 

cd ~/ 
directoriesToBack='.bashrc Desktop/School/ Desktop/Research\ Project' 

tar -X ~/Desktop/My\ Programs/scripts/crons/exclude.txt -zcvf $tarname $directoriesToBack 

mv $tarname ~/Dropbox 

变量directoriesToBack显然包含要复制的目录。 Exclude.txt是不需要备份的文件的文本文件。

如果我尝试运行此脚本,由于Desktop/Research Project,我得到一个错误:我的电脑改为寻找目录Desktop/Research。我试图用双引号而不是单引号,并用普通空格替换\,但这些尝试不起作用。有谁知道我可以如何使用其名称中的空格来备份一个目录?

回答

1

不要试图用字符串来做到这一点。它不会工作,它会导致疼痛。有关各种细节和讨论,请参阅I'm trying to put a command in a variable, but the complex cases always fail!

改为使用数组。

#!/bin/bash 
DATE=$(date +%Y-%m-%d) 
tarname=backup-$DATE.tar.gz 

cd ~/ 
directoriesToBack=(.bashrc Desktop/School "Desktop/Research Project") 

tar -X ~/Desktop/My\ Programs/scripts/crons/exclude.txt -zcvf "$tarname" "${directoriesToBack[@]}" 

我也修正了变量/ etc的引用。并使用$()而不是日期命令执行的反引号(因为$()可以嵌套并且通常具有更好的语义和行为)。

+0

不幸的是你的代码产生了错误'Syntax error:“(”unexpected' – 2015-01-20 19:54:59

+0

啊,真的,'/ bin/sh'不能做数组,需要''bash'或者其他shell。修复 – 2015-01-20 19:56:39

+0

现在代码有效, – 2015-01-20 19:58:11

-1

CD桌面/“研究项目”(带引号)

你会发现,在许多语言中大量的代码使用引号来表示的空间。

+0

这段代码仍然产生一个错误信息:'tar:Desktop /“Research:不能stat:没有这样的文件或目录; tar:Desktop /”Research:不能统计:没有这样的文件或目录' – 2015-01-20 19:57:20

0

请运行脚本并显示EXACT错误消息。我怀疑发生了什么事不是你想象的那样。我怀疑envar directoriesToBack不是你认为的那样。

+0

这是一个评论不是答案。 – 2015-01-20 19:59:18