У меня есть файл, который экспортировал кучу имен файлов, которые нужно удалить. Мне нужно знать, как удалить каждый файл без необходимости запускать его по одному в командной строке.
Я думал просто разместить это внутри 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
(работает, если у вас одно имя файла в строке)