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

Вопрос или проблема

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

Используйте 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

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

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

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. Если ваш список имеет одну или несколько строк имен файлов, разделенных пробелами или табами, тогда выполнение:

    sed -i 's/\s\+/\n/g' listOfFiles.txt
    

    это преобразует все пробелы в переводы строк

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    

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

.

Ответ или решение

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

Теория

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

  1. Чувствительность к спецсимволам: Имена файлов могут содержать пробелы, специальные символы и даже новые строки, что усложняет работу с ними стандартными методами командной строки.

  2. Безопасность: Удаление файлов может быть разрушительным, если случайно удалить нужные данные. Поэтому необходимо предусмотреть возможность ошибочного удаления, например, через создание резервных копий или предварительную проверку списков файлов.

  3. Системные ограничения: Разные операционные системы могут иметь разные команды и наборы утилит для работы с файловыми системами. Соответственно, предлагаемое решение должно быть адаптировано под конкретную окружение.

Примеры решений

Использование 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.

  • Логирование: Ведение логов о процессе удаления файлов может помочь в последующем анализе и устранении неполадок.

Таким образом, удаление файлов на основе списка из текстового файла не только требует знания команд, но и учета множества факторов, чтобы процесс был безопасным и эффективным.

Оцените материал
Добавить комментарий

Капча загружается...