Вопрос или проблема
У меня есть текстовый файл с перечнем путей к различным файлам. Есть ли команда, которую я могу использовать, чтобы пройти по каждой строке и удалить файл по указанному пути?
Используйте xargs
:
xargs rm < file # или
xargs -a file rm
Но это не будет работать, если имена/пути содержат символы, которые должны быть экранированы.
Если в ваших именах файлов нет перевода строки, вы можете сделать следующее:
tr '\n' '\0' < file | xargs -0 rm # или
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
Вот один из способов, который может справиться с именами файлов с пробелами, обратными слешами и другими странными символами (кроме переводов строки в именах файлов, но если у вас есть это, то вам нужно хранить имена файлов в файле с использованием чего-то другого, чем перевод строки, для их разделения):
while read -r file; do rm -- "$file"; done < list.txt
Это будет читать каждую строку из list.txt
, сохранять эту строку как $file
и выполнять rm
на $file
. -r
гарантирует, что обратные слеши читаются буквально (так что \t
соответствует \
и t
, а не TAB). --
гарантирует, что это также обрабатывает файлы, имена которых начинаются с -
.
Вы также можете сделать это на 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'))
Сохраните предыдущий скрипт в файле, например, как script.py
, а затем выполните его, запустив следующую команду в терминале.
python3 script.py file
file
это входной файл, в котором хранятся пути к файлам, которые вы действительно хотите удалить.
Глупо, но вот один способ:
tar -cvf /dev/null --remove-files -T filename
Другой способ сделать это:
Вы можете ‘подготовить’ файл, превратив его в сценарий оболочки:
$ sed -E "s/^(.*)$/rm '\1"https://askubuntu.com/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
Если в ваших именах файлов может быть одинарная кавычка ('
), вы можете использовать эту слегка расширенную версию для их экранирования:
$ sed -E "s/"https://askubuntu.com/"\\\''; s/^(.*)$/rm '\1"https://askubuntu.com/" 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/"https://askubuntu.com/"\\\''; s/^(.*)$/rm '\1"https://askubuntu.com/" 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
Да, есть много способов это сделать, но это очень простой подход.
.
Ответ или решение
Удаление файлов, перечисленных в текстовом файле, может стать важной задачей в управлении системой, особенно когда речь идет об автоматизации работы или оптимизации процессов. Прежде чем углубиться в способы решения этой задачи, важно понять, какие проблемы могут возникнуть и как их избежать.
Теория
Когда речь идет об удалении файлов, необходимо учитывать несколько аспектов:
-
Чувствительность к спецсимволам: Имена файлов могут содержать пробелы, специальные символы и даже новые строки, что усложняет работу с ними стандартными методами командной строки.
-
Безопасность: Удаление файлов может быть разрушительным, если случайно удалить нужные данные. Поэтому необходимо предусмотреть возможность ошибочного удаления, например, через создание резервных копий или предварительную проверку списков файлов.
-
Системные ограничения: Разные операционные системы могут иметь разные команды и наборы утилит для работы с файловыми системами. Соответственно, предлагаемое решение должно быть адаптировано под конкретную окружение.
Примеры решений
Использование xargs
xargs
— это мощная утилита, которая позволяет передавать аргументы в команду из стандартного ввода. Однако, если в названиях файлов есть пробелы или другие специальные символы, это может вызвать проблемы. Пример команды:
xargs -a file -I{} rm {}
В этой команде -a
указывает файл, из которого xargs
читает строки, а -I{}
заменяет {}
текущей строкой из файла.
Использование скрипта Bash
Скрипт Bash может предоставить больше гибкости и позволяет более точно обрабатывать ввод.
#!/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"
Этот скрипт проверяет наличие файла со списком и удаляет каждый файл, имя которого указанное в строках.
Использование Python
Python предлагает удобный способ работы с файлами благодаря своим обширным библиотекам.
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
Скрипт читает каждую строку из указанного файла и удаляет файл с именем, указанным в этой строке. Это удобно, если необходимо расширить функциональность, например, добавить логирование или обработку ошибок.
Применение
Примеры кода и команд, рассмотренные выше, можно легко адаптировать для различных окружений и требований. При этом существует несколько ключевых практических аспектов, которые нужно учитывать:
-
Тестирование перед выполнением: Перед тем как действительно удалить файлы, можно использовать команду
echo
вместоrm
, чтобы сначала убедиться, что команды работают корректно. -
Резервное копирование: Особенно в производственных системах, полезно иметь резервные копии файлов перед их удалением.
-
Обработка ошибок: Добавление обработчиков ошибок может помочь избежать прерывания работы скрипта в случае, если один из файлов не удается удалить (например, из-за отсутствия прав доступа).
-
Повышение прав доступа: Если некоторые файлы требуют прав суперпользователя для удаления, следует использовать с осторожностью команды вроде
sudo
. -
Логирование: Ведение логов о процессе удаления файлов может помочь в последующем анализе и устранении неполадок.
Таким образом, удаление файлов на основе списка из текстового файла не только требует знания команд, но и учета множества факторов, чтобы процесс был безопасным и эффективным.