tar 文本文件中列出的特定数量的文件

tar 文本文件中列出的特定数量的文件

我有一个包含文件列表的文本文件。

我用。

tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from abc.txt

此命令只是创建一个包含文本文件中列出的所有文件的 tar。

有什么方法可以只压缩列表中选定数量的文件吗?例如,仅说明文本文件中列出的前 50 个文件。

答案1

您可以尝试类似的方法:(已更新以允许文件名中包含空格

head -50 abc.txt | tr "\n" "\0" | xargs -0 tar --null -no-recursion -uf abc.tar --directory=/tmp/temp

该命令head -50将获取列表文件的前 50 行。该结果通过管道传输|tr.基本上,tr将执行翻译操作,\n用空字符替换换行符\0。结果通过管道传输到xargs -0,这会将所有这些行转换为tar命令的参数。-0的参数使其xargs根据空字符而不是空格来分隔参数。即使您的文件名有空格,这也将使该命令正常工作。

感谢乔丹的评论。

答案2

您可以使用headtail来控制文件中限制的文件数量abc.txt

例子

样本abc.txt文件。

$ cat abc.txt
afile1
afile10
afile2
afile3
afile4
afile5
afile6
afile7
afile8
afile9

现在我们只打包以下位置的前 3 个文件abc.txt

$ head -3 abc.txt | tr '\n' '\0' | tar --null --no-recursion -uf abc.tar -T -

以上获取 的输出head ...,将行尾字符 ( \n) 转换为空字符 ( \0)。然后,该输出通过管道传输至 tar,后者通过 STDIN ( -T -) 接收该输出。最后一位告诉tar我们将 STDIN 作为输入,这是tar.

确认abc.tar

$ tar tvf abc.tar 
-rw-rw-r-- saml/saml         0 2013-08-05 13:24 afile1
-rw-rw-r-- saml/saml         0 2013-08-05 13:24 afile10
-rw-rw-r-- saml/saml         0 2013-08-05 13:24 afile2

您可以将上面的内容从head -3 ...head -100 ... for example, to get the 1st 100. Or you could usetail -100 ...` 更改为获取文件中的最后 100 个。

答案3

受到 jordanm 对 Bichoy 答案的评论的启发,以下是处理带空格的文件名的方法:

count=50
i=1
while [ $i -le $count ]
do
    read filename
    tar --null -no-recursion -ruf abc.tar "$filename" --directory=/tmp/temp
    i=$(($i+1))
done <abc.txt

我使用while循环而不是 dofor i in {1..50}来允许您对所需的行数进行软编码。

答案4

如果您确定文件名中没有换行符,请将空字节转换为换行符并调用head以仅保留前几行。

<abc.txt tr '\0' '\n' |
head -n 50 |
tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -

为了处理包含换行符的文件名,您可以转置换行符和空值,然后让其head内容,然后转回。

<abc.txt tr '\0\n' '\n\0' |
head -n 50 |
tr '\0\n' '\n\0' |
tar --null --no-recursion -uf abc.tar --directory= /tmp/temp --files-from -

相关内容