Cara menghapus file yang tercantum dalam file teks

23

Saya memiliki file teks yang memiliki daftar jalur ke berbagai file. Apakah ada perintah yang bisa saya gunakan yang akan mengulangi setiap baris dan menghapus file di jalur yang ditentukan?

daka
sumber

Jawaban:

33

Gunakan xargs:

xargs rm < file  # or
xargs -a file rm

Tapi itu tidak akan berfungsi jika nama file / jalur berisi karakter yang harus diloloskan.

Jika nama file Anda tidak memiliki baris baru, Anda dapat melakukannya:

tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}

Atau, Anda dapat membuat skrip berikut:

#!/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"

Simpan sebagai /usr/local/bin/delete-from, berikan izin eksekusi:

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

Kemudian jalankan dengan:

delete-from /path/to/file/with/list/of/files
Eric Carvalho
sumber
2
Jawaban benar-benar bersih, tetapi cattidak diharuskan, Anda dapat menggunakan stdinredirection:< file xargs rm
kos
Ini memisahkan nama folder dan mencari mereka. Misalnya MY FOLDER ditafsirkan sebagai "MY" dan "FOLDER"?
daka
@sudoman Jawaban dimutakhirkan.
Eric Carvalho
Jika file tidak memiliki spasi maka Anda bisa saja "rm - $ (file cat)" di bash atau "rm - cat file" di (ba) sh atau csh.
tukang sepatu
@shooper cattidak berguna, seperti yang baru saja disebutkan, manfaatkan dari stdin! Lihatlah jawabannya yang diperbarui
kos
20

Inilah salah satu cara yang dapat menangani nama file dengan spasi, garis miring terbalik dan karakter aneh lainnya:

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

Itu akan membaca setiap baris list.txt, simpan sebagai $filedan jalankan rmdi atasnya. The -rmemastikan bahwa backslashes dibaca secara harfiah (sehingga \tcocok dengan \dan tdan tidak TAB). Itu --memastikan bahwa itu juga berkaitan dengan nama file dimulai dengan -.

Anda juga bisa melakukan ini di Perl:

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

Yang ini akan membaca setiap nama file ke dalam %khash dan kemudian gunakan unlinkuntuk menghapus masing-masing nama.

terdon
sumber
10

Melalui python.

import sys
import os
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        os.remove(line.rstrip('\n'))

Simpan skrip di atas dalam file bernama like script.pydan kemudian jalankan skrip dengan menembakkan perintah di bawah ini pada terminal.

python3 script.py file

file adalah file input tempat jalur file yang sebenarnya ingin Anda hapus disimpan.

Avinash Raj
sumber
6
Ah, setidaknya Anda memiliki keberanian untuk mengirim jawaban python :)
Jacob Vlijm
3

Konyol, tapi ini satu:

 tar -cvf /dev/null --remove-files -T filename
tukang sepatu
sumber
2

Cara lain untuk melakukan ini:

Anda dapat 'menyiapkan' file dengan membuatnya menjadi skrip shell:

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

Jika nama file Anda mungkin memiliki satu kutipan ( '), Anda dapat menggunakan versi yang sedikit diperluas ini untuk menghindarinya terlebih dahulu:

$ 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'\'''

Dan Anda dapat menjalankan ini dengan memipangnya ke sh:

$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
Martin Tournoij
sumber
1

Seperti yang saya pahami, Anda memiliki file teks dengan file dengan path lengkap. Ada dua kemungkinan:

  1. Daftar Anda memiliki nama file yang dipisahkan oleh baris baru, yaitu setiap baris memiliki jalur lengkap ke file. dalam hal ini: inilah jalan keluar sederhana:

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. Jika daftar Anda memiliki satu atau beberapa baris nama file yang dipisahkan oleh spasi atau tab, maka inilah latihannya:

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

    ini akan mengkonversi semua spasi putih ke baris baru

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

Ya, ada banyak cara untuk menyelesaikannya, tetapi ini adalah pendekatan yang sangat sederhana.

Melompat Kelinci
sumber