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