循环遍历具有数字名称的文件夹的脚本

Ste*_*hen 5 bash shell-script wildcards

我正在编写一个 bash 脚本来压缩我的 Wordpress 文件夹中的图像。wordpress文件夹结构如下:

> wp-content/uploads/2014/01/filename.jpg
> wp-content/uploads/2014/02/filename.jpg
> wp-content/uploads/2014/03/filename.jpg
> wp-content/uploads/2014/04/filename.jpg
> 
> i.e. wp-content/uploads/YEAR/MONTH/filename.jpg
Run Code Online (Sandbox Code Playgroud)

在上传文件夹中,我有许多其他文件夹(这些文件夹是在安装插件时创建的),因此我试图遍历仅包含数字名称的文件夹,然后压缩图像。这是我到目前为止所拥有的:

DIR_UPLOADS=/home/html/wp-content/uploads/
cd ${DIR_UPLOADS}    
for d in *; do                 # First level i.e. 2014, 2013 folders.
     regx='^[0-9]+$'           # Regular Expression to check for numerics.
     if [[$d =~ $regx]]; then  # Check if folder name is numeric.
       #echo "error: Not a number" >&2; exit 1
       cd $d
       for z in *; do          # Second level i.e. the months folders 01, 02 etc.
        cd $z
        for x in *; do         # Third level the actual file.              
          echo 'Compress Image'
        done
      done
     fi
    done
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 reg ex 来检测数字文件夹,这不太正确,但我想我已经接近了。

Gra*_*eme 5

您可以bash为此使用扩展通配符:

shopt -s extglob
DIR_UPLOADS=/home/html/wp-content/uploads/
cd ${DIR_UPLOADS}

for dir in $PWD/+([0-9])/+([0-9]); do
  cd "$dir" &&
    for file in *; do
      echo 'Compress Image'
    done
done
Run Code Online (Sandbox Code Playgroud)

从手册页:

+(pattern-list)
    Matches one or more occurrences of the given patterns
Run Code Online (Sandbox Code Playgroud)

所以在里面放一个数字范围将匹配文件/目录。添加&&条件将确保您仅在匹配项是目录时才压缩图像(并且您实际上已成功输入该目录)。

如果没有扩展的通配符,你甚至可以只做[1-2][0-9][0-9][0-9]/[0-1][0-9]. 这比尝试大括号扩展要好,因为即使您没有图像,您也不会最终尝试为每个年/月输入目录。