【问题标题】:Call script on all file names starting with string in folder bash在文件夹 bash 中以字符串开头的所有文件名上调用脚本
【发布时间】:2015-01-04 21:56:31
【问题描述】:

我有一组文件,我想在一个文件夹中执行操作,我希望为其编写一个 scipt。每个文件都以mazeFilex 开头,其中x 可以是任意数字,是否有一种快速简便的方法来对每个文件执行操作?例如我会做的

cat mazeFile0.txt | ./maze_ppm 5 | convert - maze0.jpg

如果知道文件总是以mazeFile 开头,我该如何选择每个文件?

【问题讨论】:

  • 文件名或文件内容是否以mazeFile开头?

标签: bash


【解决方案1】:
for fname in mazeFile*
do
    base=${fname%.txt}
    base=${base#mazeFile}
    ./maze_ppm 5 <"$fname" | convert - "maze${base}.jpg"
done

注意事项

  • for fname in mazeFile*; do

    此代码启动循环。以这种方式编写,对所有文件名都是安全的,无论它们的名称中是否包含空格、制表符或其他任何内容。

  • base=${fname%.txt}; base=${base#mazeFile}

    这将删除 mazeFile 前缀和 .txt 后缀,只保留我们将用于输出文件的基本名称。

  • ./maze_ppm 5 &lt;"$fname" | convert - "maze${base}.jpg"

    输出文件名是使用base 构造的。另请注意,cat 是不必要的,已在此处删除。

【讨论】:

    【解决方案2】:
    for i in mazeFile*.txt ; do ./maze_ppm 5 <$i | convert - `basename maze${i:8} .txt`.jpg ; done
    

    【讨论】:

    • 不考虑 mazeFile10.txt
    • @ClintPowell 这不是真的;自己试试吧。
    • 对不起,我假设 ${i:8} 只获取索引 8 处的字符。从技术上讲你是对的,但 mazeX.txt.jpg 也不是想要的结果。跨度>
    【解决方案3】:

    您可以使用 for 循环遍历所有文件名。

    #!/bin/bash
    for fn in mazeFile*; do
        echo "the next file is $fn"
        # do something with file $fn
    done
    

    也可以在这里查看答案:Bash foreach loop 我看到您想要对 mazeFile 中的数字进行反向引用。因此我推荐John1024的回答。

    编辑:根据@guido 的评论删除不必要的ls 命令。

    【讨论】:

    • 在 for 循环中执行的 ls 命令绝对没用。更糟糕的是,它可能会引发意想不到的问题:superuser.com/questions/31464/…
    • 注明。感谢您的信息!
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多