2017-06-18 128 views
0

我有这样的组织的文件夹:包含如何排除子文件夹 “[XXX] - (YY) - [XXX]”

Folder1 
[xxx] - (aa) - [xxx] 
1.zip 
2.zip 
Folder2 
[xxx] - (bb) - [xxx] 
11.zip 
22.zip 

我需要:

  • 进入每Folderx解压该文件包含
  • 日志所提取的文件未成功提取
  • 移动提取的文件到另一个文件夹
  • 如果日志提取的文件没有成功移动 如果有任何失败,我不希望进程。通过

    for D in `find . -type d` 
    do 
        cd $D 
        echo "$(pwd)" 
        for z in *.zip; do 
         unzip -u $z 
         echo "File: " $z; 
         if [ $? -eq 0 ] 
          then 
           echo "Successfully created file" 
          else 
           echo "Could not create file" >&2 
         fi; 
        done 
    done 
    

    我试图取代一样多的东西或使用数组等:

我想出了在开始时“找到-maxdepth 1型d”。“发现-maxdepth 1”。但总有一些失败。

我的主要问题,我想的是,当我尝试:

$ find . -type d 

我得到这样的结果:

Folder1 
Folder1/[xxx] - (aa) - [xxx] 
Folder2 
Folder2/[xxx] - (bb) - [xxx] 

但是,当我在我的脚本中使用相同的命令,它解析像这样相反:

Folder1 
[xxx] 
- 
( 
a 
) 
- 
[xxx] 
Folder2 
[xxx] 
- 
(
bb 
) 
- 
[xxx] 

我从来没有找到避免在每个空间分裂路径的方法...

有什么提示吗?

在此先感谢

+0

对不起,我可怜的布局,我想我是非常糟糕的,在使用这种这里... – druid

+0

前缀代码/四个空格数据。请看[编辑帮助](http://stackoverflow.com/editing-help)。 – Cyrus

+0

谢谢,我给了它另一个镜头,这是更好的我猜...引用不工作得很好...或者至少我不使用,因为它应该在这里... – druid

回答

1

因为你的目录包含空格,字拆分对它们执行(每行find回报)。请在bash pitfalls页面上查看此场景的一个很好的说明(for在文件列表上循环)。

一个写你最for循环的方法是这样的:

find . -type d | while read D; do 
    cd "$D" 
    ... 
done 

另一种方法,更简单的操作,是只使用find-execdir行动,像这样:

find . -name '*.zip' -execdir unzip -u '{}' \; 

请注意,我们使用execdir动作,该动作在文件目录中执行命令,而不是exec,它执行com因为unzip会在当前目录中提取,除非通过-d选项给出目标目录。

或者在bash 4+,您可以使用水珠递归扩展:

shopt -s globstar 
for z in ./**/*.zip; do 
    dir="$(dirname "$z")" 
    cd "$dir" 
    unzip -u "$z" && echo "OK" || echo "Failed to extract $z" 
done 

另外,不要忘了(几乎)总是给你的变量

+0

你好,非常感谢, “find。-type d | while read D; do”让我走上路,它不起作用(尽管脚本仍然缺少几件东西 – druid

0

感谢randomir!现在已经解决了主要问题!非常感谢!

这是我到目前为止已经完成:

BASE=/path/to/my/stuff 

find . -type d | while read D 
do 
    EXTRACTED=0 
    if [[ ! "$D" =~ ^(.*)"[" ]] && [[ ! "$D" =~ ^\.$ ]] 
     then cd $BASE/$D 
      for z in *.zip 
      do 
      unzip -u $z 
       if [ $? -eq 0 ] 
        then 
         echo "ZIP SUCCESS - " $D"/"$z >> $BASE/details.log 
        else 
         echo "ZIP FAILED - " $D"/"$z >> $BASE/details.log 
         EXTRACTED=1 
       fi; 
      done 
     unrar x -o+ *.rar 
     if [ $? -eq 0 ] 
      then 
       echo "RAR SUCCESS - " $D >> $BASE/details.log 
      else 
       echo "RAR FAILED - " $D >> $BASE/details.log 
       EXTRACTED=1 
     fi; 

     if [ $EXTRACTED -eq 0 ] 
      then 
       echo "SUCCESS - " $D >> $BASE/main.log 
      else 
       echo "FAILED - " $D >> $BASE/main.log 
     fi; 
    fi; 
done 
+0

我面对的其中一个挑战是脚本会尝试访问到“。”以及其他子文件夹,我花了一段时间才明白,通过将这个问题解决,我可以很容易地解决,如果“&& [[!”$ D“=〜^ \。$]]”来管理那... – druid

+0

尝试''find。-mindepth 1 -type d''而不是。它只会返回子目录,跳过''.''。 – randomir

+0

**请** [总是引用你的变量](http ://mywiki.wooledge.org/BashPitfalls)。例如,写:'cd“$ BASE/$ D”'',''unzip -u“$ z”'',''echo“成功 - $ D/$ Z“''。 – randomir

相关问题