我的想法是,我想执行一个命令,然后它要求输入要处理的文件名,处理完成后,它输出一个名为 的图像prediction.png
,它要求下一个文件名,依此类推。我有数千个文件,因此无法一一手动输入。但是,我有一个包含所有文件名的 .txt 文件。
所以我想写一个bash脚本:
1-执行命令
2-当它询问文件名时,它会从txt文件中读取第一行
3-程序将处理该文件,输出图像,然后将该图像复制到另一个目录(以避免覆盖下一个文件)
4-然后要求下一个,做同样的事情,依此类推
直到程序请求一个文件,并且 .txt 文件已经完成,然后它自动终止
到目前为止我能做的就是一一读取文件,并在程序要求使用时将它们作为答案传递给我的程序
cat filenames.txt | ./program.sh
问题是我想cp
在处理新文件之前输出
答案1
我认为您不能在program.sh
仅运行一次时执行此操作,因为它将继续创建文件,并且您永远无法确定文件何时完成。
相反,为 filenames.txt 的每一行运行该程序一次:
while IFS= read -r FILE; do # loop through files in filenames.txt
echo "$FILE" | ./program.sh # run program once and end it with newline
mv created_filename /some/other/location/${FILE}.ext; # move file
done < filenames.txt
- 使用
mv
而不是cp
,如果您移动到相同的文件系统,速度会更快。 - 更改
.ext
输出格式(例如.png
)。
答案2
你可以这样做:
(
while IFS= read -r FILE; do
echo "$FILE"
sleep 1 # or somehow make a trigger to see when the file is ready ...
mv output_file /somewhere/else
done < filenames.txt;
) | ./program.sh
(通过)
使用 xargs 相同:
(
xargs -a filenames.txt -I{} sh -c 'echo {}; sleep 1; mv file /somewhere/else'
) | ./program.sh