来自列表或使用管道的Shell TAR文件

问题描述 投票:0回答:1

在列出一堆文件后,我试图通过管道传输TAR。首先,我尝试根据文件的日期列出文件。像这样:

ll /home/dan/test/dir*/file* | grep 2014
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_1
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_10
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_100
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_11
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir1/file1_2014_12
...
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir4/file4_2014_97
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir4/file4_2014_98
-rw-r--r-- 1 root root 0 Jan  2  2014 /home/dan/test/dir4/file4_2014_99

由于结果有点污染,所以我尝试对其进行过滤。

ll /home/dan/test/dir*/file* | grep 2014 | cut -f 2- -d "/" | sed 's/home/\/home/'
/home/dan/test/dir1/file1_2014_1
/home/dan/test/dir1/file1_2014_10
/home/dan/test/dir1/file1_2014_100
/home/dan/test/dir1/file1_2014_11
/home/dan/test/dir1/file1_2014_12
...
/home/dan/test/dir4/file4_2014_97
/home/dan/test/dir4/file4_2014_98
/home/dan/test/dir4/file4_2014_99

仅给出文件路径和名称。然后,我尝试使用管道将这个列表设为TAR,但没有成功。

所以我将列表导出到文件中

ll /home/dan/test/dir*/file* | grep 2014 | cut -f 2- -d "/" | sed 's/home/\/home/' > list_files_2014.txt

现在,我需要对该列表进行TAR。

但是当我尝试它给我一个错误:

tar -cvjf test.tar.bz2 -T list_files_2014.txt
tar: Removing leading `/' from member names
/home/dan/test/dir1/file1_2014_1
/home/dan/test/dir1/file1_2014_10
/home/dan/test/dir1/file1_2014_100
/bin/sh: 1: /home/dan/test/dir1/file1_2014_11
bzip2: not found/home/dan/test/dir1/file1_2014_12

/home/dan/test/dir1/file1_2014_13
/home/dan/test/dir1/file1_2014_14
/home/dan/test/dir1/file1_2014_15
/home/dan/test/dir1/file1_2014_16
/home/dan/test/dir1/file1_2014_17
/home/dan/test/dir1/file1_2014_18
/home/dan/test/dir1/file1_2014_19
/home/dan/test/dir1/file1_2014_2
/home/dan/test/dir1/file1_2014_20
/home/dan/test/dir1/file1_2014_21
/home/dan/test/dir1/file1_2014_22
/home/dan/test/dir1/file1_2014_23
/home/dan/test/dir1/file1_2014_24
/home/dan/test/dir1/file1_2014_25
/home/dan/test/dir1/file1_2014_26
tar: test.tar.bz2: Cannot write: Broken pipe
tar: Child returned status 127
tar: Error is not recoverable: exiting now

有人可以帮我吗?谢谢

shell tar broken-pipe
1个回答
1
投票

您不应该解析ls,因为ls的输出不稳定,只能供人类读取。操作系统更新后,此输出(其格式)可能会更改,从而使脚本出错。 @Cyrus提供的链接提供了一种更详尽的解释,在此我不想重复。无论如何,最好使用其他Unix工具来实现您的目标,例如find

但是这不是您的问题。

您的问题仅仅是您的tar尝试为您选择的压缩生成第二个进程。它尝试执行一个名为bzip2的程序。您的计算机上似乎未安装此程序,因此失败。该消息有点延迟,因为首先创建了第二个进程,然后这个并行运行的其他进程然后尝试运行程序bzip2。同时,tar进程已经开始打包文件(并制作了一些日志消息)。由于这两个进程是通过管道连接的,因此第一个进程在尝试写入该管道时将最终收到SIGPIPE(现在缺少读取器进程)。

因此,您必须安装bzip2或仅选择已安装的另一种压缩算法。例如,您可以通过将选项gzip替换为选项-j来选择-ztar的手册页列出了一堆其他受支持的压缩算法。

© www.soinside.com 2019 - 2024. All rights reserved.