在Bash中处理目录名中的空格

时间:2015-01-20 19:43:08

标签: linux bash directory

免责声明:我对Bash脚本(以及一般的Linux)都很陌生,所以请原谅我提出一个愚蠢的问题。

我的一位朋友给了我一个脚本,它将某些文件的备份副本复制到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。我尝试使用双引号而不是单引号,并用普通空格替换\,但这些尝试都不起作用。有谁知道如何备份名称中带空格的目录?

3 个答案:

答案 0 :(得分: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[@]}"

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

cd Desktop /“Research Project”(带引号)

您会发现许多语言中的许多代码都使用引号来表示空格。