循环的正确方法是什么?



我有一个脚本,其中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;

so so the等.....然后在脚本的末尾...

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

该线代表一个新的文章,以上是旧柱的旋转。

我可以将迭代一直降低到100 ,但是我想更有效地编程并节省时间。

那么,循环的一些正确方法是什么?

我认为,更好的机制将以反向数字顺序列出"$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"

请注意,我已将完整的名称包含在双引号中;如果某些东西意外获得空间,通常会导致令人讨厌的惊喜更少。

尝试以下:

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

循环将以相反顺序遍历所有目录并移动文件。

相关内容

  • 没有找到相关文章

最新更新