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?

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

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.


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.


6
Ah, setidaknya Anda memiliki keberanian untuk mengirim jawaban python :)
Jacob Vlijm


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

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.