Bash脚本从包含排除项

时间:2016-07-21 22:19:20

标签: bash shell loops exclusionpath

对于某些人来说,毫无疑问这很简单,但我绝不是一个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" )'

0 个答案:

没有答案