如何从目录中创建文件的 7zip 存档(不包括现有存档)?

如何从目录中创建文件的 7zip 存档(不包括现有存档)?

想要7zip所有文件在根/当前文件夹除了对全部zip 文件和所有 7z/7zip 文件。我只能在一个if !语句中一次让其中之一起作用:

for file in ./test2/*
do

    if ! { `file $file  | grep -i zip > /dev/null 2>&1` && `file $file  | grep -i 7z > /dev/null 2>&1`; }; then 

    ## Most of the zip utilities contain "zip" when checked for file type. 
    ## grep for the expression that matches your case

      7z a -mx0 -mmt2 -tzip "${file%/}.cbz" "$file"
      rm -rf "$file"

    fi
done

我遵循了{list;};其他帖子中的“列表”标准,但没有运气。


我目前的解决方案是 if声明,像这样:

for file in ./test2/*
do
    if ! `file $file  | grep -i 7z > /dev/null 2>&1`; then 

        if ! `file $file  | grep -i zip > /dev/null 2>&1`; then 
        ## first if its not 7z, now also if not zip.

          7z a -mx0 -mmt2 -tzip "${file%/}.cbz" "$file"
          rm -rf "$file"

        fi

    fi

done

唯一剩下的就是排除目录。所有文件都去。如何?

答案1

单独获取 的输出file,然后在多个测试或case语句中使用它:

for file in ./test2/*; do
    filetype=$( file "$file" )

    if [[ $filetype == *7z*  ]] ||
       [[ $filetype == *zip* ]]
    then
        # skip these
        continue
    fi

    # rest of body of loop here
done

或者,

for file in ./test2/*; do
    filetype=$( file "$file" )

    case $filetype in
       *7z*)  continue ;;  # skip these
       *zip*) continue ;;  # and these
    esac

    # rest of body of loop here
done

您可能还希望file输出 MIME 类型而不是自由格式的文本字符串。这可以完成file -i并且会使脚本稍微更加可移植(如果您关心这一点)。请参阅file(1)手册 ( man 1 file)。

要排除目录,只需使用

if [ -d "$file" ]; then
    continue
fi

在致电 之前file

或者,使用短路语法:

[ -d "$file" ] && continue

在上面使用的所有实例中,该continue语句将跳过当前迭代的剩余部分并继续循环的下一次迭代。当我确定当前值$file是我们可以使用的值时,我会使用想要在本次迭代中处理。这与您所做的相反,您所做的就是尝试为操作何时进行编写一组测试应该被执行。

兼容的脚本/bin/sh最终看起来像这样:

#!/bin/sh

for file in ./test2/*; do
    [ -d "$file" ] && continue

    filetype=$( file "$file" )

    case $filetype in
       *7z*)  continue ;;  # skip these
       *zip*) continue ;;  # and these
    esac

    # rest of body of loop here
done

相关内容