使bash将带有空格的变量作为单个文件名传递给tar的问题

时间:2019-01-21 02:07:15

标签: linux bash shell tar

用这个把我的头撞在墙上。我正在使用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

1 个答案:

答案 0 :(得分:0)

我将使用mapfilebackup_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