使用Bash筛选隐藏文件(用于批处理图像大小调整脚本)
我正在编写一个脚本来批量调整图像大小。最初,我对$(ls$1)中的文件应用了一个操作使用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 因
,
,但我希望能够使用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[输入文件][选项][输出文件],但我将