【问题标题】:repetitive instructions bash script重复指令bash脚本
【发布时间】:2012-10-26 20:17:51
【问题描述】:

这很容易是任何语言...但我现在使用的是 bash。我正在寻找可以跨语言复制的背后的理解。

所以...

我正在将一个文件复制到目录树上,而不是用另一个文件替换该文件。

     cp "$DIR"/folder2/file2 "$DIR";
     mv "$DIR"/folder1/file1 "$DIR"/folder2/file2;

然后我把复制的文件移到另一个文件夹中。开始同样的舞蹈。

     cp "$DIR"/folder3/file3 "$DIR";
     mv "$DIR"/file2 "$DIR"/folder3/file3

我想这样做 100 次以上。

什么是最优雅的方式?

优雅,简明扼要,别人可以理解。

【问题讨论】:

  • 迭代之间有什么变化?你能发布一个你想变成循环的重复命令的示例吗?
  • 仅供参考——非环境变量应该小写,以免与环境变量和保留名称冲突。因此$dir,而不是$DIR
  • 哇...我只是想弄清楚如何区分我的环境变量和非环境变量...你一定是个幽灵
  • 为什么第一步使用cp,而下一步是替换(和删除)原始文件?看起来您应该在这两个步骤中使用 mv
  • 点了..但除了正确性之外,流程是否有改进?

标签: bash loops scripting


【解决方案1】:
for i in {1..100}; do
    j=$((i+1))

    cp "$DIR"/folder$j/file$j "$DIR"
    mv "$DIR"/folder$i/file$i "$DIR"/folder$j/file$j
done

【讨论】:

  • 一个更简洁的增量替代方案是((i++))
  • 我希望这个解决方案能按我的意愿工作,但如果我手动继续迭代,它确实会得到相同的结果......它会不断删除文件夹中的 evthing
【解决方案2】:

您正在尝试:

  1. 备份文件 B.
  2. 将文件 A 重命名(或移动)为文件 B。
  3. 备份文件 C.
  4. 将文件 B 的备份重命名为文件 C。
  5. 备份文件 D.
  6. 将文件 C 的备份重命名为文件 D。

等等。

倒过来其实更简单,只需要备份最后一个文件。

last=100
mv "$DIR/folder$last/file$last" "$DIR"
for i in $(seq $last -1 2); do
  mv "$DIR/folder$((i-1))/file$((i-1))" "$DIR/folder$i/file$i"
done 

注意:

  • seq $last -1 2 生成从$last2 的数字序列,增量为-1
  • 我使用seq 而不是大括号扩展,因为当您拥有{$last .. 1} 时,后者不会扩展数字

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 2013-03-08
    • 2017-11-21
    • 2019-03-30
    • 2020-04-02
    • 2020-03-21
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多