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

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

1
задан 29 April 2016 в 00:39

5 ответов

Вот один из способов, который может иметь дело с именами файлов с пробелами, обратными слэшами и другими странными символами:

while read -r file; do rm -- "$file"; done < list.txt

Это будет читать каждую строку list.txt, сохранить его как $file и запустить [ f5]. [F6] гарантирует, что обратная косая черта читается буквально (так что \t соответствует \ и t, а не TAB). [F10] гарантирует, что он также имеет дело с именами файлов, начиная с -.

Вы также можете сделать это в Perl:

perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt

Этот файл должен прочитать каждое имя файла в хеше %k, а затем использовать unlink для удаления каждого из них.

15
ответ дан 23 May 2018 в 22:26

Через python.

import sys
import os
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        os.remove(line.rstrip('\n'))

Сохраните приведенный выше сценарий в файле с именем like script.py, а затем выполните скрипт, выполнив команду ниже на терминале.

python3 script.py file

] file - это входной файл, в котором сохраняется путь к файлам, которые вы хотите удалить.

8
ответ дан 23 May 2018 в 22:26
  • 1
    Ах, по крайней мере, у вас есть смелость отправить ответ на python :) – Jacob Vlijm 14 March 2015 в 12:48

Глупо, но вот одно:

 tar -cvf /dev/null --remove-files -T filename
2
ответ дан 23 May 2018 в 22:26

Другой способ сделать это:

Вы можете «подготовить» файл, сделав его сценарием оболочки:

$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'

Если ваши имена файлов могут иметь одну цитату ([ f4]), вы можете использовать эту небольшую расширенную версию, чтобы избежать их в первую очередь:

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
rm 'a file with "quotes"'
rm 'a file with '\''quotes'\'''

И вы можете запустить это, связав ее с sh:

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
2
ответ дан 23 May 2018 в 22:26

Как я понимаю, у вас есть текстовый файл с файлами с полными путями. Возможны две возможности:

В вашем списке есть имена файлов, разделенные символами новой строки, то есть каждая строка имеет полный путь к файлу. в этом случае: вот простой выход:
for i in $(cat listOfFiles.txt); do
    rm -f $i
done
Если в вашем списке есть одна или несколько строк имен файлов, разделенных пробелами или вкладками, тогда это упражнение:
sed -i 's/\s\+/\n/g' listOfFiles.txt
это преобразует все пробелы в строки новой строки
for i in $(cat listOfFiles.txt); do
    rm -f $i
done
[ ! d1]

Да, есть много способов сделать это, но это очень простой подход.

1
ответ дан 23 May 2018 в 22:26

Другие вопросы по тегам:

Похожие вопросы: