6

I have a file that exported a bunch of file names that need to be removed. I need to know how to go about removing each file without having to issue it one at a time at the command line.

I've thought about just cating it inside a for loop, which would probably work, but wanted to know if there was an easier, or even a better solution to doing this.

Thanks.

9 Answers 9

5
rm -rf `cat /path/to/filename`

`` characters can be replace with $()

from bash man page:

   Command Substitution
       Command substitution allows the output of a command to replace the command
       name.  There are two forms:

              $(command)
       or
              `command`

       Bash performs the expansion by executing command and replacing the command
       substitution  with  the  standard output of the command, with any trailing
       newlines deleted.  Embedded newlines are not  deleted,  but  they  may  be
       removed  during  word splitting.  The command substitution $(cat file) can
       be replaced by the equivalent but faster $(< file).

       When the old-style backquote  form  of  substitution  is  used,  backslash
       retains its literal meaning except when followed by $, `, or \.  The first
       backquote not preceded by a backslash terminates the command substitution.
       When  using  the  $(command)  form, all characters between the parentheses
       make up the command; none are treated specially.

       Command substitutions may be nested.  To nest when  using  the  backquoted
       form, escape the inner backquotes with backslashes.

       If the substitution appears within double quotes, word splitting and path‐
       name expansion are not performed on the results.
3
  • 1
    Will fail with filenames that contain whitespace. Aug 27, 2010 at 16:29
  • My failnames did not have spaces and this worked better in this case. This does need work though to handle spaces in filenames. Aug 27, 2010 at 16:42
  • 1
    Fair warning, this will also be limited by the number of results you get--anything over 32k will fail on kernels pre-2.6.23. This is generally why xargs is used: cat /path/to/filename | xargs rm -rf. Its also much easier to read and debug.
    – Andrew M.
    Aug 30, 2010 at 12:48
13

No need for cat or a loop:

xargs -d '\n' -a file.list rm
1
  • Contrary to the comment of @AndresRehm this did not properly handle whitespace in my case. So, I removed the whitespace in the text file using the Vim command: :%s/\s\+$//e Mar 22, 2019 at 21:37
8
$ cat file.list | xargs rm
1
  • 1
    I would prefer xargs - it handles whitespace and special characters as it should. Aug 27, 2010 at 17:30
5
while read filename ; do rm "$filename" ; done < files.lst
4
perl -lne 'unlink' files_to_remove.txt

If you need to remove lots of files this is several times faster than xargs + rm, and many many times faster than a shell loop.

1

Just for the hell of it, just make the file into a script and execute it handles whitespace and most other awkward characters and is simple. Does not spawn more processes than most of the above methods.

sed -ie 's/^/rm -f "/;s/$/"/' <filename>
sh <filename>
1
  • 2
    You don't need to modify the original file, just do it on the fly: sh -c "$(sed -e 's/\(.*\)/rm -f "\1"/' <filename>)" (also showing an alternative sed script). Aug 28, 2010 at 14:39
0

Current answers are sufficient - xargs may fail if you have too many files though - in that case you'll need some kind of loop.

Also - when performing this kind of thing it's not a bad idea to , rather than delete, move the files to another folder, so you can manually verify that some weird filenames haven't made some kind of mistake. Then, when you are confident you are okay, just delete the folder.

0

Not the best one, but it works -:)

cat myfile | awk '{print "rm -rf " $0}' | bash
0

One more: xargs rm < /path/to/file

(works if you have one filename per line)

You must log in to answer this question.

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