数値名でフォルダを繰り返すスクリプト

数値名でフォルダを繰り返すスクリプト

WordPressフォルダの画像を圧縮するためのbashスクリプトを作成しています。 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

アップロードフォルダには他のフォルダ(プラグインのインストール時に作成されます)がたくさんあるため、数字名のフォルダのみを循環してから画像を圧縮してみました。これが私が今まで持っているものです:

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

数値フォルダを検出するためにreg exを使用しようとしていますが、これは正確ではありませんが、ほぼ近いようです。

答え1

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

マニュアルページから:

+(pattern-list)
    Matches one or more occurrences of the given patterns

したがって、内部に数値範囲を入力すると、ファイル/ディレクトリが一致します。条件を追加すると、一致が&&ディレクトリの場合にのみ画像を圧縮できます(実際にそのディレクトリに正常に入力した場合)。

拡張ワイルドカードなしでこれを行うことができます[1-2][0-9][0-9][0-9]/[0-1][0-9]。これは、その時点で画像がなくても毎年/月の目次を入力しようとしないため、中括弧を拡張しようとするよりも優れています。

答え2

これを行うには、次のアプローチを使用すると思いましたが、findスクリプトの質問に対する回答を支援するために、例を少し修正しました。

#!/bin/bash

for d in *; do                # First level i.e. 2014, 2013 folders.
  regx='^[0-9]+$'             # Regular Expression to check for numerics.
  echo "dir: $d"
  if [[ $d =~ $regx ]]; then  # Check if folder name is numeric.
    echo "found num: $d"
    pushd $d >& /dev/null
    for z in *; do            # Second level i.e. the months folders 01, 02 etc.
      pushd $z >& /dev/null
      for x in *; do          # Third level the actual file.              
        echo "Compressing Image: $x"
      done
      popd >& /dev/null
    done
    popd >& /dev/null
  fi
done

あなたの方法はよさそうだ。私の考えの問題の一部はcd。私は通常あなたの例に追加したので、代わりにpushd使用します。popd

はい

WordPressアップロードディレクトリでこのコマンドを実行すると、次のようになります。

$ pwd
/var/www/html/apps/wordpress/wp-content/uploads

実行例:

$ ./asc.bash | head -15
dir: 2009
found num: 2009
Compressing Image: GURULABS-RPM-GUIDE-v1.0.pdf
Compressing Image: How_to_create_an_RPM_package.mht
Compressing Image: ss_mtr_1-150x150.png
Compressing Image: ss_mtr_1-300x146.png
Compressing Image: ss_mtr_1.png
Compressing Image: ss_mtr_2-150x150.png
Compressing Image: ss_mtr_2-300x115.png
Compressing Image: ss_mtr_2.png
Compressing Image: ss_mtr_3-150x150.png
Compressing Image: ss_mtr_3-300x117.png
Compressing Image: ss_mtr_3.png
Compressing Image: ss1_trac_gitplugin-1024x262.png
Compressing Image: ss1_trac_gitplugin-150x150.png

改善する

特定の月を見る前に、その月のディレクトリが空の場合に備えていくつかのテストを追加します。それ以外の場合は、次のような結果が得られます。

Compressing Image: *
Compressing Image: *
Compressing Image: *

これらのディレクトリツリーをナビゲートするのは難しいかもしれません。ディレクトリ構造はかなり構造化されているので、次のようにしたらどうでしょうか?

for dir in 20*/*; do
  echo "$dir"
  for files in $dir/*; do
    if [ -e $dir/$files ]; then
      echo "$dir/$files: ..compress.."
    fi
  done
done

または次のようになります。

for year in $(printf '%4d\n' {2000..2014}); do
  echo "$year"
  for mnth in $(printf '%02d\n' {00..12}); do
    if [ -e $year/$mnth ]; then
      echo "$mnth"
    fi
  done
done

関連情報