Bash 如何排除包含“的子文件夹”;[xxx]-(yy)-[xxx]”;

Bash 如何排除包含“的子文件夹”;[xxx]-(yy)-[xxx]”;,bash,parsing,directory,subdirectory,Bash,Parsing,Directory,Subdirectory,我有这样组织的文件夹: Folder1 [xxx] - ( aa) - [xxx] 1.zip 2.zip Folder2 [xxx] - ( bb ) - [xxx] 11.zip 22.zip find . -type d | while read D; do cd "$D" ... done find . -name '*.zip' -execdir unzip -u '{}' \; 我需要: 进入每个Folderx解压它包含的文件 如果提取的文件未成功提取

我有这样组织的文件夹:

Folder1
[xxx] - ( aa) - [xxx]
 1.zip
 2.zip
Folder2
[xxx] - ( bb ) - [xxx]
 11.zip
 22.zip
find . -type d | while read D; do
    cd "$D"
    ...
done
find . -name '*.zip' -execdir unzip -u '{}' \;
我需要:

  • 进入每个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
我尝试了很多方法,比如用“find.-maxdepth 1”替换“find.-maxdepth 1-typed”,或者使用数组等等,但总会有一些方法失败

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

$ find . -type d
我得到这个结果:

Folder1
Folder1/[xxx] - ( aa) - [xxx]
Folder2
Folder2/[xxx] - ( bb ) - [xxx]
但当我在脚本中使用相同的命令时,它会像这样解析它:

Folder1
[xxx]
-
( 
a
)
-
[xxx]
Folder2
[xxx]
-
(
bb
)
-
[xxx]
我从来没有找到一种方法来避免在每个空间分割路径

有什么提示吗


提前感谢

因为您的目录包含空格,所以会对它们执行分词操作(在每行
find
returns中)。请参见页面上关于此场景的详细说明(文件循环列表的

循环编写最外层
的方法之一如下:

Folder1
[xxx] - ( aa) - [xxx]
 1.zip
 2.zip
Folder2
[xxx] - ( bb ) - [xxx]
 11.zip
 22.zip
find . -type d | while read D; do
    cd "$D"
    ...
done
find . -name '*.zip' -execdir unzip -u '{}' \;
对于更简单的操作,另一种方法是将
find
-execdir
操作一起使用,如下所示:

Folder1
[xxx] - ( aa) - [xxx]
 1.zip
 2.zip
Folder2
[xxx] - ( bb ) - [xxx]
 11.zip
 22.zip
find . -type d | while read D; do
    cd "$D"
    ...
done
find . -name '*.zip' -execdir unzip -u '{}' \;
注意:我们使用执行文件目录中命令的
execdir
操作,而不是执行当前目录中命令的
exec
,因为
解压
在当前目录中提取,除非指定了目标目录通过
-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

另外,别忘了(几乎)总是引用你的变量

多亏了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

很抱歉布局不好,我想我在这里用得很糟糕…谢谢,我又试了一次,我想这样更好。。。引用不是很有效。。。或者至少我没有按预期使用……您好,非常感谢,“find.-Typed | while read d;do”让我走上了正轨,但它不起作用(尽管脚本仍然缺少一些东西。我面临的另一个挑战是脚本将尝试访问”以及其他子文件夹,我花了一段时间才明白,通过将此项与我的if“&&&[!“$D”=~^\.$]”相关联来管理它,可以很容易地解决这个问题…请尝试
查找-mindepth 1-键入D
。它将只返回子目录,跳过
。例如,编写:
cd“$BASE/$D”
解压-u“$z”
echo“Success-$D/$z”