The idea is that I want to execute a command, then it asks for a file name to process, and after it is done with processing, it outputs an image with the name prediction.png, it asks for the next filename and so on. I have thousands of files, so I cannot enter them manually one by one. However, I have a .txt file containing all the filenames.

So I wanted to write a bash script which:

1- execute the command

2- when it asks about a filename, it reads the first line from the txt file

3- the program will process the file, outputs an image, then cp this image to another directory (to avoid overwriting for the next file)

4- then asks for the next, do the same and so on

until the program asks for a file, and already the .txt file is done, then it terminates automatically

What I can do up till now is reading files one by one and passing them as answers for my program when it asks using

cat filenames.txt | ./program.sh

The problem, is that I want to cp the output before processing the new file

  • crossposted: askubuntu.com/questions/1060761/… Jul 30, 2018 at 13:11
  • it is a new question to the same script.
    – pLumo
    Jul 30, 2018 at 13:12
  • @steeldriver yes different question but related to the same script Jul 30, 2018 at 13:17
  • Do you have the ability to modify program.sh? Jul 30, 2018 at 14:35
  • @glennjackman it is an exe dependent on some c files, so it is too much, because I need to edit the c files and then make again and so that's why I was looking for an easier solution Jul 31, 2018 at 6:30

2 Answers 2


I don't think you can do this while running program.sh just once, as it will continue creating the files, and you can never be sure when a file is complete.

Instead run the program once for each line 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
  • Use mv instead of cp, it will be faster if you're moving to the same file system.
  • Change .ext to the output format (e.g. .png).
  • The problem that running the program takes time, but it is already supporting the option of passing multiple files. That's why it is much much faster to run it once, then whenever it asks for a file, I pass its name to it Jul 30, 2018 at 12:41
  • If you have access to the original script, edit it, but without being able to change it, I think you have no choice.
    – pLumo
    Jul 30, 2018 at 12:43
  • concerning the part where you said 'I will never be sure when a file is complete', no I will, because when it is done with a file, it asks for a new file, and accordingly, I can pass the new file name Jul 30, 2018 at 12:44
  • 1
    someone familiar with expect may help you ...
    – pLumo
    Jul 30, 2018 at 13:15
  • 1
    echo -e "$FILE\n" is too much work: what's wrong with plain echo "$FILE" ? If you want that much control over the newlines in the output, use printf "%s\n" "$FILE" Jul 30, 2018 at 14:08

You can do it like this:

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


same using xargs:

xargs -a filenames.txt -I{} sh -c 'echo {}; sleep 1; mv file /somewhere/else'
) | ./program.sh
  • Please tell me what is wrong when downvoting, so I can learn.
    – pLumo
    Jul 31, 2018 at 7:36

Not the answer you're looking for? Browse other questions tagged .