【问题标题】:shell script : for loop on list of filesshell脚本:文件列表上的for循环
【发布时间】:2015-04-03 14:28:28
【问题描述】:

我有一个包含大量文件的文件夹,我想对其中的一些文件执行操作。我有文件“BlaBla_01.mat”、“BlaBla_02.mat”到“BlaBla_11.mat”

{ time mpiexec -n 40 ./runex @alg.param BlaBla_01.mat; } 

--> 这会生成 2 个输出文件。我需要重命名并移动它们...

mv FirstOut.log My/Folder/Results/FirstOut_BlaBla_01.log
mv NextOut.log My/Folder/Results/NextOut_BlaBla_01.log

如何在 for 循环中进行此操作,以便按应有的方式处理和重命名文件?

我试过了:

NUMS='01 02 03 04 05 06 07 08 09 10 11'
for i in $NUMS;
do
FILENAME="BlaBla_"$i".mat"
{ time mpiexec -n 40 ./runex @alg.param $FILENAME; }
mv FirstOut.log "My/Folder/Results/FirstOut_BlaBla_"$i".log"
mv NextOut.log "My/Folder/Results/NextOut_BlaBla_"$i".log"
done;

以及它的许多变体,但它不起作用。

很抱歉,这一定是一个非常简单的问题,但我不是程序员,所以这是我在 shell 脚本上的第一周

提前谢谢你,

周末愉快

Seb

【问题讨论】:

  • 那个循环不起作用怎么办? (通常也避免使用ALL_CAPS 变量名,因为它们是为外壳“保留”的。)
  • 对于初学者,您可以将$i 留在双引号内
  • 解决这个问题的最佳方法是让runex 程序在正确的位置以正确的名称创建输出文件。如果它在您的控制之下,请修复它。如果不是,请说出来。 mpiexec -n 40 命令是否在同一个文件上运行程序的 40 个副本?

标签: string shell for-loop filenames


【解决方案1】:

试试这个:

NUMS='01 02 03 04 05 06 07 08 09 10 11'
for i in ${NUMS[@]};
do
FILENAME="BlaBla_"$i".mat"
{ time mpiexec -n 40 ./runex @alg.param $FILENAME; }
mv FirstOut.log "My/Folder/Results/FirstOut_BlaBla_"$i".log"
mv NextOut.log "My/Folder/Results/NextOut_BlaBla_"$i".log"
done;

【讨论】:

  • 不,NUMS 不是数组。碰巧${NUMS[0]} 返回了整个字符串,并且因为它没有被引用,所以您可以遍历字符串的单词。与$NUMS相比没有优势
【解决方案2】:

我会这样写

for root in BlaBla_{01..11}; do
    time mpiexec -n 40 ./runex @alg.param "$root.mat"
    mv FirstOut.log "My/Folder/Results/FirstOut_$root.log"
    mv NextOut.log "My/Folder/Results/NextOut_$root.log"
done;

大括号扩展需要 bash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多