压缩文件列表在其文件名中包含空格

时间:2014-02-16 13:14:25

标签: linux bash tar

我一直在尝试使用bash文件压缩一组包含其文件名空格的文件。 bash文件是:

#!/bin/bash
tar -cPf 'myconfigs.tar' `cat myconfigs.list`

myconfigs.list文件的内容是:

/home/anas/.config/chromium/Default/Bookmarks
/home/anas/.config/chromium/Default/Login Data
/home/anas/.config/chromium/Default/Login Data-journal

问题是文件名中包含空格的文件不包含在结果TAR存档中。 我试过'',“”,%20 ......但没有用。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

鸭,

我认为您需要使用:

tar -cPf myconfigs.tar -T myconfigs.list

而不是你的“猫”。如果你正确地逃避里面的文件名,cat也应该工作,但-T更好。

更新(解决您提问题的评论): 我无法评论你的问题(没有足够的声誉),所以我决定改进我的答案。

波浪号(〜)扩展是shell的东西,tar不支持它。但是,要实现您想要实现的目标,您可以使用以下技巧:

  • 在myconfigs.list文件中使用相对路径(相对于主目录):
    .config/chromium/Default/Bookmarks
    .config/chromium/Default/Login Data
    .config/chromium/Default/Login Data-journal
  • 运行tar,使其在启动时将目录更改为您的家:
    tar -cPf myconfigs.tar -C ~/ -T myconfigs.list

好的,我继续创建了一个说明它的示例会话:

root@web:~ # useradd -m galaxy
root@web:~ # su - galaxy
galaxy@web:~ $ mkdir -p {1,2}/{3,4}/{5,6,7}
galaxy@web:~ $ find . -xdev -type d -exec touch '{}/file.txt' \;
galaxy@web:~ $ cat << EOF > include.lst
> 1/3
> 1/4/5/file.txt
> 1/4/7
> 2/file.txt
> EOF
galaxy@web:~ $ cd 2/3/6
galaxy@web:~/2/3/6 $ tar cjSpf ~/sample.tar.bz2 -C ~/ -T ~/include.lst
galaxy@web:~/2/3/6 $ cd
galaxy@web:~ $ tar tjvf sample.tar.bz2
drwx------ galaxy/galaxy     0 2014-02-19 04:10 1/3/
-rw------- galaxy/galaxy     0 2014-02-19 04:10 1/3/file.txt
drwx------ galaxy/galaxy     0 2014-02-19 04:10 1/3/7/
-rw------- galaxy/galaxy     0 2014-02-19 04:10 1/3/7/file.txt
drwx------ galaxy/galaxy     0 2014-02-19 04:10 1/3/6/
-rw------- galaxy/galaxy     0 2014-02-19 04:10 1/3/6/file.txt
drwx------ galaxy/galaxy     0 2014-02-19 04:10 1/3/5/
-rw------- galaxy/galaxy     0 2014-02-19 04:10 1/3/5/file.txt
-rw------- galaxy/galaxy     0 2014-02-19 04:10 1/4/5/file.txt
drwx------ galaxy/galaxy     0 2014-02-19 04:10 1/4/7/
-rw------- galaxy/galaxy     0 2014-02-19 04:10 1/4/7/file.txt
-rw------- galaxy/galaxy     0 2014-02-19 04:10 2/file.txt
galaxy@web:~ $

这个应该给你一个开始:)

答案 1 :(得分:3)

不要像那样使用cat的输出,否则空间被认为是tar命令的分隔符和separete参数。

您可以使用-T tar option

tar -cPv -T myconfigs.list -f myconfigs.tar