Skip to content
Advertisement

Put quotes around string before first forward slash in line by line file read

I am writing a bash script that deletes all the files whose paths are given in delete.txt. delete.txt is thousands of lines long, each line has a path that is structured like this:

Abies concolor/images/FV-GFVM-725_crop.jpg

Where there is a space in the name of the first directory.

Currently, my bash script reads each line of delete.txt, saves it to$line and deletes it.

#!/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do
    "rm $line"
done < "$1"

However, because there is a space in the first directory name, my rm command returns:

rm Abies concolor/images/FV-GFVM-725_crop.jpg: No such file or directory

What can I do in my bash script to add a quote before the first and after the second words of each line before doing the rm command?

Advertisement

Answer

The problem is with rm invocation. Just correctly quote line variable:

#!/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do
   rm "$line"
done < "$1"

Or, even simpler, you can use xargs and this oneliner which replaces the complete script:

cat delete.txt | xargs -I{} rm '{}'

This will run rm for each line in delete.txt, properly quoted. The trick here is to use -I <placeholder> option which will make sure the command rm '<placeholder>' is executed once per line (not word), each time substituting <placeholder> with filename from current line.

User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement