我有一个包含文件列表的文本文件。
我用。
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
您可以使用head
或tail
来控制文件中限制的文件数量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 use
tail -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 -