【问题标题】:Problem getting bash to pass variable with spaces as single filename to tar问题让 bash 将带有空格的变量作为单个文件名传递给 tar
【发布时间】: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

标签: linux bash shell tar


【解决方案1】:

我会使用 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

【讨论】:

  • 谢谢你,毫不奇怪,我让这个问题变得比它本应出于无知更困难,-T 选项最适合我的情况,并且也使用了 -X。从手册页中学到的一个不明显的教训是 -X 选项需要在 -T 之前出现,通过 -X 提供的排除模式似乎没有其他影响。
猜你喜欢
  • 2020-11-02
  • 2018-11-26
  • 2016-04-18
  • 2020-03-16
  • 2016-04-21
  • 1970-01-01
  • 2016-02-09
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多