毫无疑问,这对某人来说很简单,但无论如何我都不是 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" )'