1

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

0 回答 0