Назад | Перейти на главную страницу

Удалить файлы, перечисленные в текстовом файле

У меня есть файл, который экспортировал кучу имен файлов, которые нужно удалить. Мне нужно знать, как удалить каждый файл без необходимости запускать его по одному в командной строке.

Я думал просто разместить это внутри for цикл, который, вероятно, сработает, но хотел знать, есть ли более простое или даже лучшее решение для этого.

Спасибо.

Нет необходимости в cat или петля:

xargs -d '\n' -a file.list rm
$ cat file.list | xargs rm
while read filename ; do rm "$filename" ; done < files.lst
rm -rf `cat /path/to/filename`

символы можно заменить на $ ()

со страницы руководства bash:

   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.
perl -lne 'unlink' files_to_remove.txt

Если вам нужно удалить много файлов, это в несколько раз быстрее, чем xargs + rm, и во много раз быстрее, чем цикл оболочки.

Просто преобразуйте файл в сценарий и выполните его, обрабатывая пробелы и большинство других неудобных символов, и это просто. Не порождает больше процессов, чем большинство вышеперечисленных методов.

sed -ie 's/^/rm -f "/;s/$/"/' <filename>
sh <filename>

Текущих ответов достаточно - xargs может не работать, если у вас слишком много файлов - в этом случае вам понадобится какой-то цикл.

Кроме того, при выполнении таких действий неплохо было бы вместо удаления переместить файлы в другую папку, чтобы вы могли вручную убедиться, что некоторые странные имена файлов не сделали какой-либо ошибки. Затем, когда вы будете уверены, что все в порядке, просто удалите папку.

Не самый лучший, но работает - :)

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

Еще один: xargs rm < /path/to/file

(работает, если у вас одно имя файла в строке)