![如何从目录中创建文件的 7zip 存档(不包括现有存档)?](https://linux22.com/image/149262/%E5%A6%82%E4%BD%95%E4%BB%8E%E7%9B%AE%E5%BD%95%E4%B8%AD%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E7%9A%84%207zip%20%E5%AD%98%E6%A1%A3%EF%BC%88%E4%B8%8D%E5%8C%85%E6%8B%AC%E7%8E%B0%E6%9C%89%E5%AD%98%E6%A1%A3%EF%BC%89%EF%BC%9F.png)
想要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