【发布时间】:2019-01-22 02:11:30
【问题描述】:
用这个把我的头撞到墙上。我正在使用 bash 脚本将目录名称文件(每行一个名称,没有字符转义)读入一个变量,并使用该变量在这些目录上调用 tar 。如果其中一个目录中有空格,我无法将其正确传递给 tar (不断将其夹在两个单独的项目上不会保留我添加的转义)。我已经尝试了很多变体,但下面是最新的。真正令人沮丧的部分是 echo 显示命令采用我期望的确切形式并按预期手动运行。提前感谢您的帮助。
bash 脚本
#!/bin/bash
#build list of directories to backup from backup_dirs.txt
BACKUP_DIRS=
while read dir; do
#create escaped version of string to handle spaces, etc...
esc_line=$(printf '%q' "${dir}")
echo "###### adding dir '${esc_line}'"
#add new dire to list
BACKUP_DIRS=${BACKUP_DIRS}\ "${esc_line}"
done < backup_dirs.txt
echo tar -cjvPf backup.tar.bz2 ${BACKUP_DIRS}
#run backup
tar -cjvPf backup.tar.bz2 ${BACKUP_DIRS}
backup_dirs.txt 内容示例
my_stuff
My Stuff
观察到的输出
###### adding dir 'my_stuff'
###### adding dir 'My\ Stuff'
tar -cjvPf backup.tar.bz2 my_stuff My\ Stuff
my_stuff/
tar: My\\: Cannot stat: No such file or directory
tar: Stuff: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
【问题讨论】:
-
只需将它们添加到数组中,而不是尝试将它们压缩到单个字符串中
-
在这种情况下你可以
tar -cjvPf backup.tar.bz2 -T backup_dirs.txt