处理 Bash 目录名中的空格
Dealing with spaces in directory names in Bash
免责声明:我对 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
。我试过使用双引号而不是单引号,并用普通的 space 替换 \
,但这些尝试都没有用。有谁知道如何备份名称中包含 spaces 的目录?
不要尝试对字符串执行此操作。它不会起作用,而且会引起疼痛。有关各种详细信息和讨论,请参阅 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[@]}"
我还修复了 variables/etc 的引用。并使用 $()
而不是反引号来执行日期命令(因为 $()
可以嵌套并且通常具有更好的语义和行为)。
cd Desktop/"Research Project"(带引号)
您会发现许多语言的很多代码都使用引号来表示 space。
请运行脚本并显示准确的错误消息。我怀疑出了什么问题不是你想的那样。我怀疑 envar directoriesToBack 不是你想的那样。
免责声明:我对 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
。我试过使用双引号而不是单引号,并用普通的 space 替换 \
,但这些尝试都没有用。有谁知道如何备份名称中包含 spaces 的目录?
不要尝试对字符串执行此操作。它不会起作用,而且会引起疼痛。有关各种详细信息和讨论,请参阅 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[@]}"
我还修复了 variables/etc 的引用。并使用 $()
而不是反引号来执行日期命令(因为 $()
可以嵌套并且通常具有更好的语义和行为)。
cd Desktop/"Research Project"(带引号)
您会发现许多语言的很多代码都使用引号来表示 space。
请运行脚本并显示准确的错误消息。我怀疑出了什么问题不是你想的那样。我怀疑 envar directoriesToBack 不是你想的那样。