【问题标题】:Create tar in current working directory without the entire parent directory?在没有整个父目录的情况下在当前工作目录中创建 tar?
【发布时间】:2020-05-21 22:36:15
【问题描述】:

我想 tar 一个目录(包括该目录本身),但我不想要父目录,我想将它保存在当前工作目录中。

我正在使用:

'''cd /home/user/directory'''

'''tar -zcvf backup.tar.gz *'''

但它只保存 /directory 内的文件和文件夹,而不是 /directory 本身作为 tar 的头目录。

此外,我希望 bash 脚本将 tar 文件保存在用户的当前工作目录中。我对 bash 脚本很陌生,所以任何帮助都将不胜感激!

【问题讨论】:

  • 我忘了提,我以为我在使用时做对了: tar -zcvf backup.tar.gz /home/user/directory 之前,但它也保存了 /home 和/user 目录也是我不想要的
  • cd ..; tar -zcvf backup.tar.gz directory
  • cd /home/user/ && tar -zcvf backup.tar.gz directory.
  • cd .... || { echo "Something went wrong!" >&2; exit 1; } ; .... 以防万一cd 因某种原因失败,您将遇到错误并且不会执行其余代码/命令...

标签: bash tar


【解决方案1】:

*(在您的 tar 命令末尾)扩展为“当前目录中的所有内容”,所有这些都将作为参数传递给您的 tar 命令。尝试运行

echo *

看看我的意思。

你可能想要这样的东西:

cd /home/user
tar zcvf backup.tar.gz directory

【讨论】:

  • Gnu tar 1.29 抱怨:tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options当您在选项中省略破折号时。
  • @Roadowl Weird:我的“tar (GNU tar) 1.29”没有抱怨。
  • 白痴!我的 tar 别名(很可能从很久以前开始)为 tar --no-same-permissions --no-same-owner,显然当这些长选项(没有短选项等效项)前面没有选项之一 -Acdtrux` 时,它会窒息,无论是否“破折号” '。我在手册页中找不到任何提及此行为的内容。
【解决方案2】:

可以使用--transform(来自man tar)在 tar 存档中添加前缀(并操作文件名、路径):

--transform=EXPRESSION,--xform=EXPRESSION

使用 sed replace EXPRESSION 转换文件名

您想添加一个目录,可以使用以下transform 表达式来完成:

's,^,directory/,'

, = 分隔符,基本上可以是任何东西,只要在所有地方都使用相同的字符

s = 搜索和替换

^ = 行首

directory/ = 选择文本

基本上它说,“用directory/替换行首”。

例子:

→ tree -a .
.
├── dir1
│   └── file3
├── file1
└── file2
→ tar --transform 's,^,directory/,' -zvcf backup.tar.gz *
dir1/
dir1/file3
file1
file2
→ tar tf backup.tar.gz
directory/dir1/
directory/dir1/file3
directory/file1
directory/file2
→ mkdir tmp && cd tmp/
→ tar xf ../backup.tar.gz
→ tree -a .
.
└── directory
    ├── dir1
    │   └── file3
    ├── file1
    └── file2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2021-06-22
    • 2011-08-07
    • 2016-12-12
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多