【问题标题】:Dealing with spaces in directory names in Bash在 Bash 中处理目录名称中的空格
【发布时间】:2015-01-20 19:43:07
【问题描述】:

免责声明:我对 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。我尝试使用双引号而不是单引号,并将\ 替换为普通空格,但这些尝试没有奏效。有谁知道如何备份名称中带有空格的目录?

【问题讨论】:

    标签: linux bash directory


    【解决方案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[@]}"
    

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

    【讨论】:

    • 不幸的是,您的代码产生了错误Syntax error: "(" unexpected
    • 啊,没错,/bin/sh 不做数组。需要bash 或其他外壳。修复。
    【解决方案2】:

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

    【讨论】:

    • 这是评论而非答案。
    【解决方案3】:

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

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

    【讨论】:

    • 此代码仍会产生错误消息:tar: Desktop/"Research: Cannot stat: No such file or directory; tar: Desktop/"Research: Cannot stat: No such file or directory
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2021-07-17
    • 2019-04-02
    相关资源
    最近更新 更多