gpt4 book ai didi

unix - 帮助 unix tar 和 grep 循环

转载 作者:行者123 更新时间:2023-12-04 17:09:57 25 4
gpt4 key购买 nike

我需要一些帮助来创建一个循环,该循环将采用我的文件扩展名之一 .tar.gz将其解压缩并使用 grep -a >> output.text 搜索其中的文件(扩展名为 .tlg)。

在 outout.text 中,我将需要匹配数据以及文件名和它来自的父 tar

一旦执行了此搜索,我希望删除未压缩的文件,并继续处理下一个 tar 文件,直到检查完所有 tars。

我不能一次全部解压,因为我没有足够的磁盘空间

谁能帮忙?

谢谢

最佳答案

为避免创建临时文件,您可以使用 GNU tar 的 --to-stdout选项。

下面的代码要注意路径中的空格和其他可能会混淆 shell 的字符:

#! /usr/bin/perl

use warnings;
use strict;

sub usage { "Usage: $0 pattern tar-gz-file ..\n" }

sub output_from {
my($cmd,@args) = @_;
my $pid = open my $fh, "-|";
warn("$0: fork: $!"), return unless defined $pid;
if ($pid) {
my @lines = <$fh>;
close $fh or warn "$0: $cmd @args exited " . ($? >> 8);
wantarray ? @lines : join "" => @lines;
}
else {
exec $cmd, @args or die "$0: exec $cmd @args: $!\n";
}
}

die usage unless @ARGV >= 2;
my $pattern = shift;
foreach my $tgz (@ARGV) {
chomp(my @toc = output_from "tar", "-ztf", $tgz);
foreach my $tlg (grep /\.tlg\z/, @toc) {
my $line = 0;
for (output_from "tar", "--to-stdout", "-zxf", $tgz, $tlg) {
++$line;
print "$tlg:$line: $_" if /$pattern/o;
}
}
}

样本运行:

$ ./grep-tlgs hello tlgs.tar.gz tlgs/another.tlg:2: hellotlgs/file1.tlg:2: hellotlgs/file1.tlg:3: hellotlgs/third.tlg:1: hello
$ ./grep-tlgs ^ tlgs.tar.gz tlgs/another.tlg:1: blah blahtlgs/another.tlg:2: hellotlgs/another.tlg:3: howdytlgs/file1.tlg:1: whoahtlgs/file1.tlg:2: hellotlgs/file1.tlg:3: hellotlgs/file1.tlg:4: good-byetlgs/third.tlg:1: hellotlgs/third.tlg:2: howdy
$ ./grep-tlgs ^ xtlgs.tar.gz tar: xtlgs.tar.gz: Cannot open: No such file or directorytar: Error is not recoverable: exiting nowtar: Child returned status 2tar: Exiting with failure status due to previous errors./grep-tlgs: tar -ztf xtlgs.tar.gz exited 2 at ./grep-tlgs line 14.

关于unix - 帮助 unix tar 和 grep 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3202883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com