我创建了一个脚本来确定所有tar.gz
文件,它由5个tar文件组成,最后一个tar文件应该保留tar,不应该提取它。所以我的问题是它将全部提取tar.gz
文件。
while true; do
for f in *.tar.gz; do
case $f in '*.tar.gz') exit 0;; esac
tar zxf "$f"
rm -v "$f"
done
done
解决问题的正确方法是什么?
答案 0 :(得分:1)
你说:
我创建了一个脚本来确定所有
tar.gz
文件,它由5个tar文件组成,最后一个tar文件应该保留tar,不应该提取它。
我可以看到两种解释:
目录中有五个带有.tar.gz
扩展名的文件。应提取并删除前四个文件;第五个应保留未提取。
有一个.tar.gz
个文件,其中包含5个.tar
个文件。这些.tar
文件中的前四个应从.tar.gz
中提取出来;第五个应保留未提取。
有很多方法可以处理每种情况。我假设tar文件名不包含空格或换行符或其他奇怪的字符(这是合理的)。如果您有古怪的文件名,那么首先清理它们可能是最简单的。除此之外,这些假设意味着您可以安全地使用ls
输出。但是,最好不要这样做。我将假设5是一个固定且神奇的数字。
i=0
for tarfile in *.tar.gz
do
$(($i++))
[ $i = 5 ] && break
tar -xf "$tarfile"
done
这会对它提取的文件进行计数,并在计数达到5后停止(因此它只会提取前4个文件)。
tarfiles=$(tar -tf *.tar.gz | sed '$d')
tar -xf *.tar.gz $tarfiles
这将收集压缩tar文件中包含的tar文件列表,并删除列出的最后一个。然后它请求tar
提取剩余的文件 - 因此该目录将包含原始.tar.gz
文件以及除{qen} .tar.gz
文件中提取的最后文件之外的所有文件。如果提取的文件是tar文件,则可以单独提取这些文件:
for tarfile in $tarfiles
do tar -xf "$tarfile"
done
如果你想删除提取的tar文件,你也可以这样做。
$ mkdir junk
$ cp *.c junk
$ cd junk
$ ls
bo.c zigzag.c
$ for i in {1..5}; do tar -cf tarfile-$i.tar *.c; done
$ ls -l
total 144
-rw-r--r-- 1 jleffler staff 546 May 7 22:34 bo.c
-rw-r--r-- 1 jleffler staff 10752 May 7 22:35 tarfile-1.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-2.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-3.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-4.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-5.tar
-rw-r--r-- 1 jleffler staff 7305 May 7 22:34 zigzag.c
$ tar -czf tarfile-N.tar.gz *.tar
$ ls -l
total 152
-rw-r--r-- 1 jleffler staff 546 May 7 22:34 bo.c
-rw-r--r-- 1 jleffler staff 10752 May 7 22:35 tarfile-1.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-2.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-3.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-4.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-5.tar
-rw-r--r-- 1 jleffler staff 2787 May 7 22:36 tarfile-N.tar.gz
-rw-r--r-- 1 jleffler staff 7305 May 7 22:34 zigzag.c
$ tar -tvf tarfile-N.tar.gz
-rw-r--r-- 0 jleffler staff 10752 May 7 22:35 tarfile-1.tar
-rw-r--r-- 0 jleffler staff 10752 May 7 22:36 tarfile-2.tar
-rw-r--r-- 0 jleffler staff 10752 May 7 22:36 tarfile-3.tar
-rw-r--r-- 0 jleffler staff 10752 May 7 22:36 tarfile-4.tar
-rw-r--r-- 0 jleffler staff 10752 May 7 22:36 tarfile-5.tar
$ rm *.tar *.c
$ ls -l
total 8
-rw-r--r-- 1 jleffler staff 2787 May 7 22:36 tarfile-N.tar.gz
$ tarfiles=$(tar -tf *.tar.gz | sed '$d')
$ echo $tarfiles
tarfile-1.tar tarfile-2.tar tarfile-3.tar tarfile-4.tar
$ tar -xf *.tar.gz $tarfiles
$ ls -l
total 104
-rw-r--r-- 1 jleffler staff 10752 May 7 22:35 tarfile-1.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-2.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-3.tar
-rw-r--r-- 1 jleffler staff 10752 May 7 22:36 tarfile-4.tar
-rw-r--r-- 1 jleffler staff 2787 May 7 22:36 tarfile-N.tar.gz
$ for file in $tarfiles; do echo $file; tar -tvf $file; rm $file; done
tarfile-1.tar
-rw-r--r-- 0 jleffler staff 546 May 7 22:34 bo.c
-rw-r--r-- 0 jleffler staff 7305 May 7 22:34 zigzag.c
tarfile-2.tar
-rw-r--r-- 0 jleffler staff 546 May 7 22:34 bo.c
-rw-r--r-- 0 jleffler staff 7305 May 7 22:34 zigzag.c
tarfile-3.tar
-rw-r--r-- 0 jleffler staff 546 May 7 22:34 bo.c
-rw-r--r-- 0 jleffler staff 7305 May 7 22:34 zigzag.c
tarfile-4.tar
-rw-r--r-- 0 jleffler staff 546 May 7 22:34 bo.c
-rw-r--r-- 0 jleffler staff 7305 May 7 22:34 zigzag.c
$ rm -f *
$ cd ..
$ rmdir junk
$
答案 1 :(得分:0)
问题是您正在使用此命令提取文件:
tar zxf "$f"
这样做会解压缩gzip
文件&然后一次性提取tar
存档。因此,将提取所有tar
个红色内容。相反,您要做的是使用gzip -d
代替:
gzip -d "$f"
这只会解压缩gzip
。至于只提取前四个tar
档案而不是第五个档案的内容的逻辑,似乎有更多的代码逻辑你没有分享?