【问题标题】:Linux Shell Script For Each File in a Directory Grab the filename and execute a program目录中每个文件的 Linux Shell 脚本 获取文件名并执行程序
【发布时间】:2010-02-19 15:43:34
【问题描述】:

场景:

Linux 系统中的文件夹。我想遍历文件夹中的每个 .xls 文件。

此文件夹通常由各种文件夹、各种文件类型(.sh、.pl、.csv、...)组成。

我要做的就是遍历根目录中的所有文件,并仅在 .xls 文件上执行程序。

编辑:

问题是我必须执行的程序是“xls2csv”,用于从 .xls 转换为 .csv 格式。因此,对于每个 .xls 文件,我必须获取文件名并将其附加到 .csv。

例如,我有一个 test.xls 文件,xls2csv 的参数是:xls2csv test.xls test.csv

我说得有道理吗?

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    重击:

    for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
    

    【讨论】:

    • 简直太棒了!完美运行!非常感谢!
    • 这正是我正在寻找的完全不同的原因。一点点编辑,它非常适合我的特定需求。谢谢 =D 对于不清楚这是做什么的人:${f%.ext} 替换没有扩展名的文件名,所以在这个例子中,它会呈现为“filename.csv”而不是“filename.csv”。 xls.csv"。
    • 嘿,我在 Google 上搜索了“linux foreach txt 文件”并找到了这个。这正是我所需要的,我实际上是在尝试使用 xls2csv 但我想我找不到任何搜索结果:)
    • 如果 *.xls 不匹配任何文件,$f 将具有 *.xls 的值。如果有问题,请查看我的答案。
    • 或者你可以设置nullglob来跳过循环。
    【解决方案2】:
    for i in *.xls ; do 
      [[ -f "$i" ]] || continue
      xls2csv "$i" "${i%.xls}.csv"
    done
    

    do 中的第一行检查“匹配”文件是否真的存在,因为如果您的for 中没有任何匹配项,do 将使用“*.xls”作为$i 执行。这对您的xls2csv 来说可能很可怕。

    【讨论】:

      【解决方案3】:

      查看find 命令。

      你正在寻找的是类似的东西

      find . -name "*.xls" -type f -exec program 
      

      发布编辑

      find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;
      

      将执行xls2csv file.xls file.xls.csv

      更接近你想要的。

      【讨论】:

      • find -maxdepth 1 排除子文件夹。这也将test.xls 转换为test.xls.csv 而不是test.csv。所以不是 相当 OP 要求的,但非常接近。
      • 使用 {} 作为参数的子字符串而不是整个参数是 GNU 扩展,find 的 POSIX 规范不保证。因此,此答案不一定可移植到非 GNU 平台。
      【解决方案4】:
      find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash
      

      bash 4(递归)

      shopt -s globstar
      for xls in /path/**/*.xls
      do
        xls2csv "$xls" "${xls%.xls}.csv"
      done
      

      【讨论】:

      • 优秀的解决方案。我已经使用它来允许我在 node.js 项目的设计时编写 haml/scss 并构建到 html/css 中。
      • 如果您不相信您的文件名不包含 $(rm -rf /)... 或仅包含空格之类的内容,这将非常危险。
      猜你喜欢
      • 2015-05-24
      • 2012-05-02
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2013-05-08
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多