Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在目录中递归解压缩文件夹(保留文件夹名称)_Perl - Fatal编程技术网

Perl 在目录中递归解压缩文件夹(保留文件夹名称)

Perl 在目录中递归解压缩文件夹(保留文件夹名称),perl,Perl,我正在寻找一种方法来解压缩指定目录中的多个文件夹(*.zip),并保留每个文件夹的名称。我希望这是Perl脚本的一部分。我需要使用shell吗?请提出一个实现这一目标的方法 我尝试了以下从主Perl脚本调用的shell脚本: 但它只解压缩了第一个文件夹,没有保留文件夹名 elif [[ "$process" == "unzip" ]];then cd $datapath folders="$(ls)" cd $home for ff in

我正在寻找一种方法来解压缩指定目录中的多个文件夹(*.zip),并保留每个文件夹的名称。我希望这是Perl脚本的一部分。我需要使用shell吗?请提出一个实现这一目标的方法

我尝试了以下从主Perl脚本调用的shell脚本: 但它只解压缩了第一个文件夹,没有保留文件夹名

elif [[ "$process" == "unzip" ]];then
        cd $datapath
        folders="$(ls)"
        cd $home
    for ff in $folders; do
        sname=$ff
                echo $sname
        if [  ! -f $sname ];then
                        cd $datapath
                        cd $sname
                        cmd2="unzip -n '*.zip'"
                        echo $cmd2
                        cmd2=`unzip -n '*.zip'`
                        echo $cmd2
                        cmd3="gunzip -f *.gz"
                        echo $cmd3
                        cmd3=`gunzip -f *.gz`
                        echo $cmd3
                        cd $home
        fi
    done
在Perl脚本中,我调用:

my $cmd2 = `perl MDL_unzip_annotate.sh /data/test_all_runs unzip`;  print "$cmd2";

**Before:**
\data\test_all_runs\SN2-63-OFA_Val_5_Chip2\Test1.zip
\data\test_all_runs\SN2-63-OFA_Val_5_Chip2\Test2.zip

**After:**
\data\test_all_runs\SN2-63-OFA_Val_5_Chip2\Test1\text_stuff.txt
\data\test_all_runs\SN2-63-OFA_Val_5_Chip2\Test2\text-stuff2.txt

使用类似于Archive::Extract的东西。从:


从注释中可以清楚地看出,目录
/data/test\u all\u runs/test
中有一些*.zip文件,您希望将它们提取到该目录下具有zipfile名称的子目录中。例如:

之前:

/data/test_all_runs/test/a.zip
/data/test_all_runs/test/b.zip
/data/test_all_runs/test/a.zip
/data/test_all_runs/test/a/file1_from_a.txt
/data/test_all_runs/test/a/file2_from_a.txt
/data/test_all_runs/test/a/file3_from_a.txt
/data/test_all_runs/test/b.zip
/data/test_all_runs/test/b/file1_from_b.txt
/data/test_all_runs/test/b/file2_from_b.txt
/data/test_all_runs/test/b/file3_from_b.txt
之后:

/data/test_all_runs/test/a.zip
/data/test_all_runs/test/b.zip
/data/test_all_runs/test/a.zip
/data/test_all_runs/test/a/file1_from_a.txt
/data/test_all_runs/test/a/file2_from_a.txt
/data/test_all_runs/test/a/file3_from_a.txt
/data/test_all_runs/test/b.zip
/data/test_all_runs/test/b/file1_from_b.txt
/data/test_all_runs/test/b/file2_from_b.txt
/data/test_all_runs/test/b/file3_from_b.txt
如果我理解正确,下面的代码可以帮助我:

#!/usr/bin/env perl

use strict;
use warnings;

sub extract_zips_to_their_folders
{
    my $source_dir = shift;

    # iterate over all *.zip files in $source_dir:
    while( my $zipfile = <$source_dir/*.zip> ) {

        # remove '.zip' from $zipfile and store the result as $tgt_dir.
        # If $zipfile is e.g. '/data/test_all_runs/test/a.zip',
        # then $tgt_dir will be '/data/test_all_runs/test/a'.
        (my $tgt_dir = $zipfile) =~ s/\.zip$//;

        # Call 'unzip' with option '-d $tgt_dir', i.e. unzip
        # the archive to the directory with the same name.
        # 'unzip' will create the directory for you.         
        system("unzip $zipfile -d $tgt_dir");
    }
}

extract_zips_to_their_folders( '/data/test_all_runs/test' );
#/usr/bin/env perl
严格使用;
使用警告;
子解压缩将其压缩到文件夹中
{
我的$source\u dir=shift;
#迭代$source\u dir中的所有*.zip文件:
而(我的$zipfile=){
#从$zipfile中删除“.zip”,并将结果存储为$tgt_dir。
#如果$zipfile是例如“/data/test\u all\u runs/test/a.zip”,
#然后$tgt_dir将是“/data/test_all_runs/test/a”。
(my$tgt_dir=$zipfile)=~s/\.zip$/;
#使用选项-d$tgt_dir调用“解压”,即解压
#将存档文件保存到同名目录中。
#“unzip”将为您创建目录。
系统(“解压$zipfile-d$tgt_dir”);
}
}
提取“拉链”到“文件夹”('/data/test\u all\u runs/test');

它调用外部命令
unzip
。正如在另一个答案中所指出的,还有一些Perl模块可用于避免此类外部调用。

“它只解压缩了第一个文件夹”,这可能是因为
datapath
是一个相对路径。您的shell代码似乎与您对所需内容的描述不匹配。请你解释得更清楚一点好吗?你是否抄袭了其他地方的shell代码,或者它是否反映了你实际上在做什么?请举例说明。@user3781528:看在上帝的份上,请给出真实的目录结构。请确认您已经采用了shell脚本;这对你的问题有很大的影响。@user3781528:“不,它不是我的,但它可以工作,但是,它不保留压缩文件夹的名称”,所以它可以工作,除非它没有?你从某处找到了一些东西,并认为你可以改变一些字符。这是一个极好的方法。我等不及要看你的小说了@用户3781528:你应该开始一个新的问题,并澄清你在这里被问到的所有事情。您应该为所有变量提供实际值,以及类似于
ls-R
的内容,以显示您正在处理的文件结构我认为我没有存档:Extract。我有Perl7。谢谢
perl-v
说什么?我很难相信您有perl 7。大多数人使用Perl5,有些人使用Perl6,但这是一种不同的语言。顺便说一下,您可以通过键入
perl-MArchive::Extract-E“say 1”
来测试是否有Archive::Extract。如果你看到1,你就有了这个模块。我选择Archive::Extract是因为它在很长一段时间内是一个“核心”模块,而且您可能已经拥有了它。但是安装模块也不难:很抱歉,我已经为x86_64-linux-thread-multi构建了perl 5,版本16,subversion 3(v5.16.3)(有29个注册补丁,请参阅perl-V了解更多详细信息),这意味着您通常会在您的系统上安装Archive::Extract模块在@INC中找不到Archive/Extract.pm(@INC包含:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor\u perl/usr/lib64/perl5/usr/share/perl5。)。然后是您的情况(目录结构)与我在前一节中所做的假设不同。以下是我所说的:解压缩:无法找到或打开/data/test_all_runs/SN2-63-OFA_Val_5_Chip2/analysis_MD-16-1207_v1_ae0fb263-b95b-4b53-a754-6b8b5c2ed608_unfiltered_results_2016-09-26,/data/test_all_runs/SN2-63-OFA_Val_5_Chip2/analysis_MD-16-1207_v1_ae0fb263-b95b-4b53-a754-6b8b5c2ed608_unfilted_results_2016-09-26.zip或/data/test_all_runs/SN2-63-OFA_Val_5_Chip2/analysis_MD-16-1207_v1_ae0fb263;-b95b-4b53-a754-6;-6;未经过滤的_结果_2016-09-26.zip目录下的未经过滤的结果。但是,我可以在这里看到使用的是什么完整的路径<代码>opendir my$dir,“/data/test_all_runs”或die“无法打开目录:$!”
my@run\u folder=readdir$dir
closedir$dir
my$run\u folder=pop@run\u folder;打印“文件夹
为“$run\u文件夹”。\n”
my$files=“/data/test\u all\u runs/”$run\u文件夹它打印出正确的路径。因此,主文件夹的名称不是“test”,而是SN2-63-OFA_Val_5_Chip2。