陷阱仅使用bash脚本提取文件5次

时间:2014-05-08 02:17:54

标签: linux bash loops tar

我创建了一个脚本来确定所有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

解决问题的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

你说:

  

我创建了一个脚本来确定所有tar.gz文件,它由5个tar文件组成,最后一个tar文件应该保留tar,不应该提取它。

我可以看到两种解释:

  1. 目录中有五个带有.tar.gz扩展名的文件。应提取并删除前四个文件;第五个应保留未提取。

  2. 有一个.tar.gz个文件,其中包含5个.tar个文件。这些.tar文件中的前四个应从.tar.gz中提取出来;第五个应保留未提取。

  3. 有很多方法可以处理每种情况。我假设tar文件名不包含空格或换行符或其他奇怪的字符(这是合理的)。如果您有古怪的文件名,那么首先清理它们可能是最简单的。除此之外,这些假设意味着您可以安全地使用ls输出。但是,最好不要这样做。我将假设5是一个固定且神奇的数字。

    场景1

    i=0
    for tarfile in *.tar.gz
    do
        $(($i++))
        [ $i = 5 ] && break
        tar -xf "$tarfile"
    done
    

    这会对它提取的文件进行计数,并在计数达到5后停止(因此它只会提取前4个文件)。

    场景2

    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文件,你也可以这样做。

    场景2的演示

    $ 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档案而不是第五个档案的内容的逻辑,似乎有更多的代码逻辑你没有分享?