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”
。