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

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

23
задан 28 April 2016 в 14:39

6 ответов

Использовать 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
33
ответ дан 23 November 2019 в 01:22

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

можно 'подготовить' файл путем создания его сценарием оболочки:

$ 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
2
ответ дан 23 November 2019 в 01:22

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

  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
ответ дан 23 November 2019 в 01:22

Глупый, но вот тот:

 tar -cvf /dev/null --remove-files -T filename
3
ответ дан 23 November 2019 в 01:22

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

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 удалить каждый из них.

20
ответ дан 23 November 2019 в 01:22

Через 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 входной файл, где путь файлов, которые Вы на самом деле хотите удалить, хранится.

10
ответ дан 23 November 2019 в 01:22

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

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