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

17

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

    
задан daka 13.03.2015 в 21:53
источник

6 ответов

28

Используйте xargs :

xargs rm < file  # or
xargs -a file rm

Но это не сработает, если имена файлов / пути содержат символы, которые должны быть экранированы.

Если ваши имена файлов не имеют новых строк, вы можете сделать:

tr '\n' '
#!/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"
' < file | xargs -0 rm # or xargs -a file -I{} rm {}

В качестве альтернативы вы можете создать следующий скрипт:

sudo chmod +x /usr/local/bin/delete-from

Сохраните его как /usr/local/bin/delete-from , предоставите ему разрешение на выполнение:

delete-from /path/to/file/with/list/of/files

Затем запустите его с помощью

%pr_e%     
ответ дан Eric Carvalho 13.03.2015 в 21:56
источник
16

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

while read -r file; do rm -- "$file"; done < list.txt

Это будет читать каждую строку list.txt , сохранить ее как $file и запустить rm на ней. -r гарантирует, что обратная косая черта читается буквально (так что \t соответствует \ и t , а не TAB). -- гарантирует, что он также имеет дело с именами файлов, начиная с - .

Вы также можете сделать это в Perl:

perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt

Этот файл прочитает каждое имя файла в хеше %k , а затем используйте unlink для удаления каждого из них.

    
ответ дан terdon 14.03.2015 в 00:44
9

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

    
ответ дан Avinash Raj 14.03.2015 в 09:46
2

Глупо, но вот одно:

 tar -cvf /dev/null --remove-files -T filename
    
ответ дан shooper 14.03.2015 в 01:18
2

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

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

$ sed -E "s/^(.*)$/rm ''/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'

Если ваши имена файлов могут содержать одну цитату ( ' ), вы можете использовать эту слегка расширенную версию, чтобы избежать их:

$ sed -E "s/'/'\\''; s/^(.*)$/rm ''/" 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 ''/" input_file | sh
    
ответ дан Martin Tournoij 14.03.2015 в 01:19
1

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

  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
    

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

ответ дан Hopping Bunny 20.03.2015 в 06:05