用这个把我的头撞在墙上。我正在使用bash脚本将目录名称文件(每行一个名称,没有转义字符)读取到一个变量中,并使用该变量在那些目录上调用tar。如果其中一个目录中有空格,我将无法正确将其传递给tar(保留将其夹在两个单独的项目中的基调不会保留我添加的转义符)。我已经尝试了许多这种变化,但是下面是最新的。真正令人沮丧的部分是echo以我期望的确切形式显示了该命令,并按预期方式手动运行。预先感谢您的帮助。
#!/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}
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
答案 0 :(得分:0)
我将使用mapfile
将backup_dirs.txt
读入bash数组:
mapfile -t BACKUP_DIRS <backup_dirs.txt
,然后像这样将其传递给tar
:
tar -cjvPf backup.tar.bz2 "${BACKUP_DIRS[@]}"
如果您有很多备份目录,建议您使用命令行选项-T
直接指定文本文件:
tar -cjvPf backup.tar.bz2 -T backup_dirs.txt