2013-04-01 10 views
1

我正在编写一个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' 

有什么不对?

回答

3

如果你打算使用一个单一的线,然后:

if [-f "${file_root}"] then 

必须有一个分号then前:

if [ -f "${file_root}" ]; then 

您还需要各地的命令名称[的空间,以及[命令的最后一个参数]之前的空格。如果使用[[表示法,则间距不太重要。

+0

我现在改变这些地方,我的代码运行。但我无法得到我想要的结果。你能帮我做点工作吗? – Decula

+0

'不能得到我想要的结果'是什么意思?这是不准确的,不可能回答。我建议通过运行'sh -x yourscript'来查看代码,看看它做了什么,以及它出错的地方。我会确保我也能看到每个中间值。例如,我可能会将两个'stat -c'命令的输出捕获到变量中,然后比较这些变量。 –

+0

与此不同的是,'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'运行,您会注意到这一点。 –

0

变化if [-f "${file_root}"] then

if [-f "${file_root}"] 
then 

if [-f "${file_root}"] ; then 
+0

谢谢,我现在改变那些地方和代码运行。但它根本无法解压缩文件。我是Shell/bash的新手。你能帮我把代码工作吗?我需要用空格处理zip文件名。 – Decula

+0

请注意,您的更改是必要的;然而,这并不足够。很少有系统有一个叫做'[-f';你需要在'[''''''''''''''''''或''''(''aka'test')命令(它通常以'/ bin/['或'/ usr/bin/['或都)。最后一个参数'''必须是'''',所以你也需要一个空间。 –