У меня есть текстовый файл, который имеет список путей к различным файлам. Есть ли команда, которую я могу использовать, которая будет проходить через каждую строку и удалять файл по указанному пути?
Вот один из способов, который может иметь дело с именами файлов с пробелами, обратными слэшами и другими странными символами:
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 для удаления каждого из них.
Через 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 - это входной файл, в котором сохраняется путь к файлам, которые вы хотите удалить.
Глупо, но вот одно:
tar -cvf /dev/null --remove-files -T filename
Другой способ сделать это:
Вы можете «подготовить» файл, сделав его сценарием оболочки:
$ 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
Как я понимаю, у вас есть текстовый файл с файлами с полными путями. Возможны две возможности:
В вашем списке есть имена файлов, разделенные символами новой строки, то есть каждая строка имеет полный путь к файлу. в этом случае: вот простой выход: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] Да, есть много способов сделать это, но это очень простой подход.