У меня есть текстовый файл, который имеет список путей к различным файлам. Существует ли команда, которую я могу использовать, который выполнит итерации через каждую строку и удалит файл в установленном пути?
Использовать xargs
:
xargs rm < file # or
xargs -a file rm
Но это не будет работать, если имена/пути файла будут содержать символы, которых нужно оставить.
Если Ваши имена файлов не имеют новых строк, можно сделать:
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
С другой стороны, можно создать следующий сценарий:
#!/bin/bash
if [ -z "$1" ]; then
echo -e "Usage: $(basename $0) FILE\n"
exit 1
fi
if [ ! -e "$1" ]; then
echo -e "$1: File doesn't exist.\n"
exit 1
fi
while read -r line; do
[ -n "$line" ] && rm -- "$line"
done < "$1"
Сохраните его как /usr/local/bin/delete-from
, дайте ему разрешение выполнения:
sudo chmod +x /usr/local/bin/delete-from
Затем выполните его с:
delete-from /path/to/file/with/list/of/files
Другой способ сделать это:
можно 'подготовить' файл путем создания его сценарием оболочки:
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
, Если Ваши имена файлов могут иметь одинарную кавычку ('
), можно использовать эту немного расширенную версию для выхода из них сначала:
$ 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
Да, существует много способов сделать его, но это - очень простой подход.
Глупый, но вот тот:
tar -cvf /dev/null --remove-files -T filename
Вот один путь, который может иметь дело с именами файлов с пробелом, обратными косыми чертами и другими странными символами:
while read -r file; do rm -- "$file"; done < list.txt
Это считает каждую строку list.txt
, сохраните его как $file
и выполненный rm
на нем. -r
гарантирует, что обратные косые черты читаются буквально (так, чтобы \t
соответствия a \
и a t
и не ВКЛАДКА). --
гарантирует, что это также имеет дело с именами файлов, запускающимися с -
.
Вы могли также сделать это в Perl:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
Эти wil читают каждое имя файла в %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'))
Сохраните вышеупомянутый сценарий в файле, названном как script.py
и затем выполните сценарий путем увольнения ниже команды на терминале.
python3 script.py file
file
входной файл, где путь файлов, которые Вы на самом деле хотите удалить, хранится.