【问题标题】:Loop over files with extension does not work循环使用扩展名的文件不起作用
【发布时间】:2020-02-05 13:58:35
【问题描述】:

我在/home/user/my/path/to/my/data/ 中有几个Name*.txt 文件,以及具有不同扩展名的其他文件。我想循环遍历它们,然后在代码中使用单个文件名,因此像this 这样的常见解决方案将不起作用,因为每个循环中的变量“$f”将整个路径与文件一起存储姓名。我需要它们分开来执行类似下面的“示例任务”。我的尝试:

尝试 #1:

#!/bin/bash

datapath="/home/user/my/path/to/my/data/"
outpath="/home/user/my/path/to/my/outputs/"

for f in $(ls $datapath"Name*.txt"); do
        echo $f
        ...
        cp $datapath$f $outpath"example_task"${f:0:10}
done

这不起作用: ls: cannot access /home/user/my/path/to/my/data/Name*.txt: No such file or directory。 虽然在终端上运行ls /home/user/my/path/to/my/data/Name*.txt 工作得很好。我不明白为什么。

尝试 #2:

#!/bin/bash

datapath="/home/user/my/path/to/my/data/"
outpath="/home/user/my/path/to/my/outputs/"

for f in $datapath"Name*.txt"; do
        echo $f
        ...
        cp $datapath$f $outpath"example_task"${f:0:10}
done

在这里,每个$f 都包含ls Name*.txt 通常会返回的文件的完整列表,而不是像预期的那样一次一个。

我该怎么做?任何建议将不胜感激。

【问题讨论】:

  • for f in "$datapath"/*.txt ; do echo "$f" ; done怎么样
  • 第一次尝试解析ls,即not a good idea。您的第二次尝试已接近尾声,只需去掉双引号即可。
  • @JamesBrown 我的datapath 已经包含斜线
  • 好吧,把它从一个或另一个中删除,你也可以离开它。
  • 然后使用${datapath}Name*.txt

标签: linux bash loops


【解决方案1】:

也许我在这里走错了路,但这对我有用。

#!/bin/bash

datapath="/home/user/my/path/to/my/data/" 
outpath="/home/user/my/path/to/my/outputs/"

cd $datapath

for f in ./*.txt; do
        file=$(echo $f | cut -d '/' -f 2)

        echo $file
        ...
        cp $f $outpath"example_task"$file 
done
cd 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多