我有一个脚本,其中inotifywait通过管道连接到执行以下逻辑的while循环。
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+,但我想更有效地编程并节省时间。
那么,循环这个的正确方法是什么?
答案 0 :(得分: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删除文件名和斜杠,只留下包含文件的目录号列表;并且sort将目录按反向数字顺序排列。
假设已经存在必要的目录,其余部分是直截了当的。在移动文件之前添加[ -d "$S3/$next" ] || mkdir -p "$S3/$next"
并不困难。显然,循环之后你可以使用你的最终命令:
mv "$dir/$file" "$S3/1/post1.png"
请注意,我用双引号括起了完整的名字;如果某些东西意外地获得空间,它通常会导致更少的令人讨厌的惊喜。
答案 1 :(得分: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
循环将以相反的顺序遍历所有目录并移动文件。