我有一个包含数百个文件的文件夹。另外,另一个文件包含目录中所有文件的名称,如下所示:
>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
有人可以帮我吗?
答案 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
文件的正确绝对路径名。