1

我正在编写一个脚本来批量调整图像大小。最初我正在应用 operation for file in $(ls $1),但我希望能够使用 globbing,所以我正在寻找更像for file in $(echo $1). 问题是 dotglob 可能会或可能不会启用,因此echo *可能会返回隐藏文件(特别是 .DS_Store),这会导致convert引发错误并停止脚本。我希望该命令的默认行为是,如果我cd进入一个充满图像的目录并执行resize * 400x400 jpg,所有图像都将调整大小,不包括隐藏文件,无论是否启用了 dotglob。

所以,在伪代码中,我正在寻找

for file in $(echo $1 | [filter-hidden-files])

这是我的旧行为脚本。当我找到解决方案时将更新新行为:

# !/bin/bash

# resize [folder] [sizeXxsizeY] [outputformat]
# if [outputformat] is omitted, the input file format is assumed

for file in $(ls $1)
do
    IMGNAME=$(echo "$file" | cut -d'.' -f1)
    if test -z $3
    then
        EXTENSION=$(echo "$file" | cut -d'.' -f2)
        convert $1/$file -resize $2 -quality 100 $1/$IMGNAME-$2.$EXTENSION
        echo "$file => $IMGNAME-$2.$EXTENSION"
    else 
        convert $1/$file -resize $2 -quality 100 $1/$IMGNAME-$2.$3
        echo "$file => $IMGNAME-$2.$3"
    fi
done

这是当前脚本:

# !/bin/bash

# resize [pattern] [sizeXxsizeY] [outputformat]
# if [outputformat] is omitted, the input file format is assumed

for file in $(echo $1)
do
        IMGNAME=$(echo "$file" | cut -d'.' -f1)
        if test -z $3 && if test -f $3
        then
            EXTENSION=$(echo "$file" | cut -d'.' -f2)
            convert $file -resize $2 -quality 100 $IMGNAME-$2.$EXTENSION
            echo "$file => $IMGNAME-$2.$EXTENSION"
        else 
            convert $file -resize $2 -quality 100 $IMGNAME-$2.$3
            echo "$file => $IMGNAME-$2.$3"
        fi
done

给定命令resize * 400x400,convert 会抛出错误,因为它无法处理 .DS_Store(OSX 系统上每个文件中的隐藏文件)。因为我永远不会处理隐藏的图像,所以我想自动过滤它们。我一直在尝试使用 grep 或 find 来执行此操作,但我还没有弄清楚。

新脚本在这里:

for file in $(echo $1)
do
4

4 回答 4

3

我建议将脚本的命令行从 更改resize * 400x400resize 400x400 *,该脚本将更像标准的 unix 工具(grepsedln等)。您不必在脚本中取消设置 dotglob 选项(这会更好,因为脚本的用户是否想要隐藏文件,这取决于脚本的用户)。

您的脚本看起来像这样:

#!/bin/bash

OUTPUTFORMAT=$1
# Remove original $1 from the list of arguments
shift

for i in "$@"
do
    # Use $OUTPUTFORMAT here
    etc....

如果您不想更改脚本的命令行。你可以尝试设置GLOBIGNORE

export GLOBIGNORE=".*"

或者,如果extglob已设置,您可以尝试像这样进行文件通配:

echo !(.*)
于 2009-11-16T09:01:50.877 回答
1

有一个shell 选项可以决定在 globbing 时是否包含dotglob以 开头的文件。.您可以检查是否是这种情况

shopt dotglob

您还可以在脚本中明确禁用它:

#!/bin/bash

shopt -u dotglob

for file in $1/*; do
  ...
done
于 2009-11-16T08:10:02.543 回答
1

当您在 $* 中获取文件列表时,您可以一一检查它们

for i in $*
do 
   expr $i : '^\..*' > /dev/null && continue
   # process file
done
于 2009-11-16T08:14:40.153 回答
1

没有必要将 ls 与 for 循环一起使用,大多数情况下它是无用的。除非您特别指定,否则带有 * 的 for 循环也不会返回隐藏文件。要显示隐藏文件,

for files in .*
do
 echo $files
done
于 2009-11-16T08:15:04.700 回答