我的文件夹组织如下:
Folder1
[xxx] - ( aa) - [xxx]
1.zip
2.zip
Folder2
[xxx] - ( bb ) - [xxx]
11.zip
22.zip
我需要:
我在开始时提出了这个问题:
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]
我从未找到避免在每个空间分割路径的方法......
有任何提示吗?
提前致谢
答案 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