我正在编写一个shell脚本来解压目录中的文件。在不同的zip文件中有相同名称的文件;代码必须保持较大的代码。为什么'else'之前的'语法错误'?
我需要解压缩/ test目录中的文件。有成千上万的zip文件,我没有空间同时解压缩它们。所以我创建一个文件夹/ test/tmp并将一个zip文件解压缩到文件夹中。然后比较/ test和/ test/tmp文件夹中的文件。如果存在重复文件,请比较它们的大小并在/ test中保留较大大小的文件。如果没有重复,请将文件从/ test/tmp移动到/ tmp。
这里是我的代码:
#!/bin/bash
A="/test"
B="/test/tmp"
archives=$(ls $A *.zip 2>/dev/null)
for archive in "${archives}"
do
mkdir -p "${B}" && unzip "${archive}" -d $B
for file_tmp in 'ls $B *.log 2>/dev/null'
do
file_root="${A}${file_tmp}"
if [-f "${file_root}"] then
if [[$(stat -c %s "${file_tmp}") -ge $(stat -c %s "${file_root}")]]
then mv "${file_tmp}" "${file_root}"
else rm "${file_tmp}"
fi
else mv "${file_tmp}" $A
fi
done
done
但我不断收到错误
unziptest.sh: line 16: syntax error near unexpected token `else'
unziptest.sh: line 16: ` else mv "${file_tmp}" $A'
有什么不对?
我现在改变这些地方,我的代码运行。但我无法得到我想要的结果。你能帮我做点工作吗? – Decula
'不能得到我想要的结果'是什么意思?这是不准确的,不可能回答。我建议通过运行'sh -x yourscript'来查看代码,看看它做了什么,以及它出错的地方。我会确保我也能看到每个中间值。例如,我可能会将两个'stat -c'命令的输出捕获到变量中,然后比较这些变量。 –
与此不同的是,'ls $ B * .log 2>/dev/null''中的file_tmp行不会运行'ls'命令,因为您有单引号而不是后引号或'$(.. )'。你需要:'对于$(ls $ B * .log 2>/dev/null)'中的file_tmp''。但仍然存在问题;你得到目录'$ B'的内容(没有任何路径名),并且你得到当前目录中的所有日志文件。这可能不是你想到的;也许你需要一个斜线:'for file_tmp in $(ls $ B/* .log 2>/dev/null)''。如果您使用'sh -x'运行,您会注意到这一点。 –