如何在每次迭代中迭代文本文件的每一行并将其分配为变量值?

时间:2019-05-09 19:04:48

标签: bash

我有一个包含数百个文件的文件夹。另外,另一个文件包含目录中所有文件的名称,如下所示:

>myfile.txt

11j
33t
dsvd33
343
im@3

我想编写bash脚本,使它进入myfile.txt的每一行,并在每次迭代中选择文件名(文件ID)并将其路径到我的CrunchMe。 更具体地说:

#!/bin/bash

for ID in myfile.txt:
  # do this
  CrunchMe ID
 end

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

@saterHater几乎是正确的。在他的解决方案中,如果文件名包含空格,则必须在工作时设置内部字段分隔符(IFS)。除了他的解决方案以外,我个人将文件名放入for loop中。请注意,for loop会有一些内存开销,但是阅读有关CrunchMe的信息我认为这并不重要。

#! /bin/bash
IFS=$'\n'
for ID in $(cat myfile.txt); do
    CrunchMe $ID
done

否则,链接@chepner可能是一种解决方案。以下代码使用更少的内存和更多的CPU资源,因为您逐行读取文件。

#! /bin/bash
while IFS='' read -r ID; do
    CrunchMe $ID
done < myfile.txt 

两个脚本具有相同的输出。在我的测试案例中,是:

1.txt
a 1.txt
lala .txt

我认为您要在更改大量文件时查看子进程。在那种情况下,您应该考虑磁盘开销,但这不是该线程的主题;-)

答案 1 :(得分:-1)

我是新手回答者,所以如果没有帮助,我深表歉意。

您需要知道的两件事是子外壳$()和变量前缀$

cat $(cat myfile.txt) | while read ID ; do 
   mv $ID CruncMe
done

我假设您将在myfile.txt和所有其他文件都在其中的本地目录中运行此文件。

否则,您可以运行find子外壳来找到$ID文件的正确绝对路径名。