如何排除包含" [xxx] - (yy) - [xxx]"的子文件夹

时间:2017-06-18 22:05:12

标签: bash parsing directory subdirectory

我的文件夹组织如下:

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-type d"通过"找到。 -maxdepth 1"或使用数组等,但总会出现失败的情况。

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

$ find . -type d

我得到了这个结果:

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

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

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

我从未找到避免在每个空间分割路径的方法......

有任何提示吗?

提前致谢

2 个答案:

答案 0 :(得分: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执行当前目录中的命令,因为unzip在当前目录中提取,除非通过-d选项给出目的地目录。

或者在bash 4+中,你可以使用glob递归扩展:

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

此外,不要忘记(几乎)始终引用您的变量

答案 1 :(得分: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