【发布时间】: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