1

我正在编写一个 shell 脚本来解压缩目录中的文件。不同的zip文件中存在同名文件;代码必须保留较大的代码。

我需要解压缩 /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'

怎么了?

4

2 回答 2

3

如果您要使用单行,则:

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

之前必须有一个分号then

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

您还需要命令名称周围的空格[,以及命令的最后一个参数之前的]空格[。如果您使用该[[符号,那么间距就不那么重要了。

于 2013-04-01T04:16:27.010 回答
0

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

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

或者

if [-f "${file_root}"] ; then
于 2013-04-01T05:19:49.150 回答