对于某些人来说,毫无疑问这很简单,但我绝不是一个bash巫师。当我需要做某事时,我倾向于学习。我有一个优化图像的脚本,只需要用图像文件夹作为参数调用它。它将确定可以使用哪些文件以及每个子文件夹。
我创建了一个简单的循环,它从txt文件读取行(图像文件夹的路径)并逐个将它们提供给优化脚本。我的问题是一些文件夹树包含我想要跳过的文件夹和子文件夹分支,比如说包含图像文件夹结构镜像的缓存。我需要的是一种轻松添加该文件夹名称的方法,例如排除txt文件,并让bash循环忽略它以及它下面的所有内容。
这是循环:
#!/bin/bash
filename='imgopt_sites.txt'
while read p; do
nice -n 10 bash /usr/local/bin/imgopt.sh $p > /dev/null 2>&1
done < $filename
这是包含要运行的文件夹的txt文件:
/srv/www/domain1.com/htdocs/wp-content/uploads
/srv/www/domain2.com/htdocs/wp-content/uploads
/srv/www/domain3.com/htdocs/wp-content/uploads
/srv/www/domain4.com/htdocs/wp-content/uploads
/srv/www/domain5.com/htdocs/wp-content/uploads
/srv/www/domain6.com/htdocs/image
将被排除的一个例子是:
/srv/www/domain6.com/htdocs/image/cache (and all under that)
这可能是在另一个txt文件中,需要循环,因为会有更多。或者,如果有一种简单的方法可以将它们全部放在同一个文件中,并以某种方式区分排除行也可以。我已经搜索过了,我发现没有任何东西可以真正击中它。感谢。
操作系统是Ubuntu 14.04,循环由cron作业调用。
最后,这是一个提供透视的示例目录树:
/srv/www/domain6.com/htdocs/image
├── cache
│ ├── catalog
│ │ ├── apparel
│ │ ├── art
│ │ ├── banners
│ │ ├── commission
│ │ ├── demo
│ │ │ ├── banners
│ │ │ └── manufacturer
│ │ ├── illustrations
│ │ ├── jewelry
│ │ ├── misc
│ │ ├── news
│ │ ├── pen_ink
│ │ └── sample_data
│ │ ├── gallery
│ │ ├── logos
│ │ ├── patterns
│ │ ├── payments
│ │ └── slider
│ └── tb
├── catalog
│ ├── apparel
│ ├── art
│ ├── banners
│ ├── commission
│ ├── illustrations
│ ├── jewelry
│ ├── misc
│ ├── news
│ ├── pen_ink
│ └── sample_data
│ ├── banners
│ ├── features
│ ├── gallery
│ ├── logos
│ ├── patterns
│ │ └── _original
│ ├── payments
│ ├── slider
│ └── wallpaper
├── data
│ └── productimage
├── flags
└── templates
任何建议都表示赞赏。
更新:这是脚本本身处理输入目录的代码段。
do_dir () {
# $1 is name of dir
local ret_val="0"
while IFS= read -r -u 3 -d $'\0' file; do
do_file "${file}"
ret_val=$?
done 3< <(find "${1}" -type f \( -iregex '.*\.[jp][pn]g$' -o -iregex '.*\.jpeg$' \) -print0)
return $ret_val
}
我对“-u 3”的作用感到有些困惑。
更新2:响应@shellter
时出现错误的新版循环#!/bin/bash
filename='imgopt_sites.txt'
excludes='imgopt_excludes.txt'
set -vx; while read p ; do nice -n 10 bash /usr/local/bin/imgopt/imgopt-ng.sh -new -progressive -sqlite $p; done <( grep -v -F -f "$excludes" "$filename" )
错误:
/usr/local/bin/imgopt/imgopt_loop.sh: line 6: syntax error near unexpected token `<( grep -v -F -f "$excludes" "$filename" )'
/usr/local/bin/imgopt/imgopt_loop.sh: line 6: `set -vx; while read p ; do nice -n 10 bash /usr/local/bin/imgopt/imgopt-ng.sh -new -progressive -sqlite $p; done <( grep -v -F -f "$excludes" "$filename" )'