使用Bash筛选隐藏文件(用于批处理图像大小调整脚本)

使用Bash筛选隐藏文件(用于批处理图像大小调整脚本),bash,filter,resize,hidden,glob,Bash,Filter,Resize,Hidden,Glob,我正在编写一个脚本来批量调整图像大小。最初,我对$(ls$1)中的文件应用了一个操作,,但我希望能够使用globbing,因此我正在研究类似于$(echo$1)中文件的,。问题是dotglob可能启用,也可能未启用,因此echo*可能返回隐藏文件(尤其是.DS\u Store),这会导致convert抛出错误并停止脚本我希望该命令的默认行为是如果我将cd放入一个满是图像的目录中并执行resize*400x400 jpg,则所有图像的大小都将调整,不包括隐藏文件,而不管是否启用了dotglob 因

我正在编写一个脚本来批量调整图像大小。最初,我对$(ls$1)中的文件应用了一个操作
,但我希望能够使用globbing,因此我正在研究类似于$(echo$1)中文件的
。问题是dotglob可能启用,也可能未启用,因此
echo*
可能返回隐藏文件(尤其是.DS\u 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

有一个
dotglob
shell选项,它决定在全局搜索时是否包括以
开头的文件。你可以检查一下你的情况

shopt dotglob
您还可以在脚本中显式禁用它:

#!/bin/bash

shopt -u dotglob

for file in $1/*; do
  ...
done

有一个
dotglob
shell选项,它决定在全局搜索时是否包括以
开头的文件。你可以检查一下你的情况

shopt dotglob
您还可以在脚本中显式禁用它:

#!/bin/bash

shopt -u dotglob

for file in $1/*; do
  ...
done

当您在$*中获得文件列表时,您可以逐个检查它们

for i in $*
do 
   expr $i : '^\..*' > /dev/null && continue
   # process file
done

当您在$*中获得文件列表时,您可以逐个检查它们

for i in $*
do 
   expr $i : '^\..*' > /dev/null && continue
   # process file
done

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

for files in .*
do
 echo $files
done

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

for files in .*
do
 echo $files
done

我建议将脚本的命令行从
resize*400x400
更改为
resize 400x400*
,这样脚本将更像标准的unix工具(
grep
sed
ln
,等等)。您不必在脚本中取消设置dotlob选项(这更好,因为它取决于脚本用户是否希望隐藏文件全局化)

您的脚本将如下所示:

#!/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 !(.*)

我建议将脚本的命令行从
resize*400x400
更改为
resize 400x400*
,这样脚本将更像标准的unix工具(
grep
sed
ln
,等等)。您不必在脚本中取消设置dotlob选项(这更好,因为它取决于脚本用户是否希望隐藏文件全局化)

您的脚本将如下所示:

#!/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 !(.*)

请记住,我不希望脚本自动作用于当前目录中的所有文件。我希望能够使用所有的globber,因此测试必须采用“echo$1 |[filter]”的形式,除非echo可以做过滤器或者我根本不需要echo。它需要使用位置参数。$*返回所有位置参数,包括“我的图像尺寸”和“输出格式”参数。如果将调用语法更改为“resize 400x400”,则可以将参数移出$。(这也类似于其他utilities处理参数的方式,即grep[SWITCHES]file1 file2…请记住,我不希望脚本自动作用于当前目录中的所有文件。我希望能够使用所有globber,因此测试的形式必须为“echo$1 |[filter]”,除非echo可以执行筛选或我根本不需要echo。它需要使用位置参数。$*返回所有位置参数,包括我的图像尺寸和输出格式参数。如果将调用语法更改为“resize 400x400”,则可以将参数从$中移出。(这也类似于其他utilities处理参数的方式,即grep[SWITCHES]file1 file2…记住,我希望使用位置参数$1作为参数,以便可以使用任何globber。另外,shopt dotglob设置为“yes”,*将返回隐藏文件。很遗憾,我似乎无法使用脚本更改此参数。请记住,我希望使用位置参数$1作为参数,以便可以使用任何globber。此外,shopt dotglob设置为“是”,*将返回隐藏文件。不幸的是,我似乎无法使用脚本更改此参数。由于某些原因,尝试在脚本中设置dotglob参数无效。如果在shell中运行shopt-u dotglob,则echo*具有所需的参数,但如果我将该行放入脚本并执行它,则不会更改参数。F或者出于某种原因,试图在脚本中设置dotlob参数不起作用。如果我在shell中运行shopt-u dotlob,那么echo*具有所需的参数,但是如果我将该行放入脚本并执行它,它不会更改参数。我希望语法与convert命令一致,该命令接受如下命令:convert[输入文件][选项][输出文件],但我将