【问题标题】:Find files and tar them with trailing or leading space in their name查找文件并在其名称中使用尾随或前导空格 tar
【发布时间】:2015-05-15 02:37:44
【问题描述】:

我有一个脚本,它试图用tar 归档目录的内容:

#!/bin/bash

find /root/files -type f -name "1*" -print0 | while read -d $'\0' file
do
    MYDIRNAME=$(dirname "${file}")
    MYFILENAME=$(basename "${file}")
    MYMODIFYDIR=$(echo "$MYDIRNAME" | sed 's/^\///' | sed 's/\//_/g' | sed 's/\ /_/g')
    MYMODIFYFILENAME=$(echo "$MYFILENAME" | sed 's/\//_/g' | sed 's/\ /_/g')
    GZIP=-9 tar -zcvf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file"
done

它不适用于名称中包含前导或尾随空格的文件。到达文件 /root/files/tetst\ test\ tgdjd/1\ 5765765\ 565765\ 时发生错误(注意文件名中的尾随空格):

tar: /root/files/tetst test tgdjd/1 5765765 565765: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

tar 给出的错误在文件名中修剪了 的尾随空格。

【问题讨论】:

  • 您始终可以运行带有.tar.gz 扩展名的tar 命令,然后使用mv 重命名文件。
  • 问题是文件末尾包含 1 5765765 565765 空间。
  • /root/files/tetst test tgdjd/1 5765765 565765 文件存在吗?

标签: linux bash tar


【解决方案1】:

您忘记在 while 循环中重置 IFS,因此前导和尾随空格被视为分隔符。使用这个:

find /root/files -type f -name "1*" -print0 | while IFS= read -d $'\0' file

如果文件名中可以​​有反斜杠,您还可以添加-r 来读取。

有关readIFS 的更详尽解释请参见此处:https://stackoverflow.com/a/26480210/1262699

【讨论】:

    【解决方案2】:

    你可以试试这个:

    tar -zcvPf /root/"$MYMODIFYDIR"_"$MYMODIFYFILENAME".tar.gz "$file"
    

    使用 -P 选项禁用此功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多