-1

次のロジックを実行するwhileループにinotifywaitがパイプされるスクリプトがあります。

     cp "$S3"/2/post2.png "$S3";
     mv "$S3"/1/post1.png "$S3"/2/post2.png;
     cp "$S3"/3/post3.png "$S3";
     mv "S3"/post2.png "$S3"/3/post3.png;

などなど.....その後、スクリプトの最後に.. ..

     mv "$dir"/$file "$S3"/1/post1.png

その線は新しい投稿を表しており、上記は古い投稿のローテーションです。

反復を100以上まで手作業でコーディングできますが、より効率的にプログラミングして時間を節約したいと思います。

それで、これをループするいくつかの正しい方法は何ですか?

4

2 に答える 2

1

より良いメカニズムは、ディレクトリを"$S3"番号の逆順にリストし、そのように処理するように配置することだと思います。100個のディレクトリがすべて存在するかどうか、またはそれらを作成する必要があるかどうかは明確ではありません。ディレクトリ1..100が存在する可能性があり、ディレクトリNには常にpostN.pngのみが含まれると想定します。

ファイルパスにスペース、改行、またはその他の厄介な文字がないことを前提としています。これは、lsあまりリスクを冒さずに使用できることを意味します。

for dirnum in $(cd "$S3"; ls */*.png | sed 's%/.*%%' | sort -nr)
do
    next=$(($dirnum + 1))
    mv "$S3/$dirnum/post$dirnum.png" "$S3/$next/post$next.png"
done

これcd "$S3"は、出力に長いパス名が含まれていない可能性があることを意味します。存在するls */*.pngファイルを一覧表示します。sedはファイル名とスラッシュを削除し、ファイルを含む電話番号のリストだけを残します。ソートにより、ディレクトリは番号の逆順になります。

必要なディレクトリがすでに存在することを前提とすると、残りは簡単です。[ -d "$S3/$next" ] || mkdir -p "$S3/$next"ファイルを移動する前に追加するのは難しくありません。明らかに、ループの後で、最後のコマンドを使用できます。

mv "$dir/$file" "$S3/1/post1.png"

完全な名前を二重引用符で囲んでいることに注意してください。何かが予期せずスペースを獲得した場合、それは一般的に厄介な驚きを少なくします。

于 2012-10-27T06:26:35.517 に答える
0

これを試して:

for i in $(ls -r1 "$3"); do 
    mkdir -p "$3/$((i+1))"
    mv "$3/$i/post$i.png" "$3/$((i+1))/post$((i+1)).png"
done
mv "$dir"/$file "$S3"/1/post1.png

ループはすべてのディレクトリを逆の順序で繰り返し、ファイルを移動します。

于 2012-10-27T06:20:56.177 に答える