Cách xóa tệp được liệt kê trong tệp văn bản


23

Tôi có một tệp văn bản có một danh sách các đường dẫn đến các tệp khác nhau. Có một lệnh tôi có thể sử dụng sẽ lặp đi lặp lại qua từng dòng và xóa tệp tại đường dẫn đã nêu?

Câu trả lời:


33

Sử dụng xargs:

xargs rm < file  # or
xargs -a file rm

Nhưng điều đó sẽ không hoạt động nếu tên tệp / đường dẫn chứa các ký tự cần được thoát.

Nếu tên tệp của bạn không có dòng mới, bạn có thể làm:

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

Ngoài ra, bạn có thể tạo tập lệnh sau:

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

Lưu nó dưới dạng /usr/local/bin/delete-from, cấp cho nó quyền thực thi:

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

Sau đó chạy nó với:

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

2
Câu trả lời thực sự rõ ràng, nhưng catkhông bắt buộc, bạn có thể sử dụng stdinchuyển hướng:< file xargs rm
kos

Nó tách tên của các thư mục lên và sau đó tìm kiếm chúng. Ví dụ: MY FOLDER đang được hiểu là "MY" và "FOLDER"?
daka

@sudoman Trả lời cập nhật.
Eric Carvalho

Nếu các tệp không có khoảng trắng thì bạn chỉ có thể "rm - $ (tệp mèo)" trong bash hoặc "rm - cat file" trong (ba) sh hoặc csh.
shooper 14/03/2015

@shooper catlà không đáng tin, như vừa nêu, hãy tận dụng stdin! Nhìn vào câu trả lời được cập nhật của anh ấy
kos

20

Đây là một cách có thể xử lý tên tệp với khoảng trắng, dấu gạch chéo ngược và các ký tự lạ khác:

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

Điều đó sẽ đọc từng dòng list.txt, lưu nó dưới dạng $filevà chạy rmtrên nó. Các -rĐảm bảo rằng những dấu xồ nguợc được đọc theo nghĩa đen (để \tphù hợp với một \và một tvà không phải là một TAB). Việc --đảm bảo rằng nó cũng xử lý các tên tệp bắt đầu bằng -.

Bạn cũng có thể làm điều này trong Perl:

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

Cái này sẽ đọc từng tên tệp vào %khàm băm và sau đó sử dụng unlinkđể xóa từng tên.


10

Qua trăn.

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

Lưu tập lệnh trên trong một tệp có tên like script.pyvà sau đó thực thi tập lệnh bằng cách thực hiện lệnh bên dưới trên thiết bị đầu cuối.

python3 script.py file

file là một tệp đầu vào trong đó đường dẫn của các tệp bạn thực sự muốn xóa được lưu trữ.


6
À, ít nhất bạn có đủ can đảm để đăng câu trả lời của con trăn :)
Jacob Vlijm


2

Một cách khác để làm điều này:

Bạn có thể 'chuẩn bị' tệp bằng cách biến nó thành tập lệnh shell:

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

Nếu tên tệp của bạn có thể có một trích dẫn ( '), bạn có thể sử dụng phiên bản được mở rộng một chút này để thoát chúng trước:

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

Và bạn có thể chạy nó bằng cách dẫn nó tới sh:

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

1

Theo tôi hiểu, bạn có một tệp văn bản với các tệp có đường dẫn đầy đủ. Có hai khả năng:

  1. Danh sách của bạn có tên tệp được phân tách bằng dòng mới, tức là mỗi dòng có đường dẫn đầy đủ đến một tệp. trong trường hợp này: đây là một cách đơn giản:

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. Nếu danh sách của bạn có một hoặc nhiều dòng tên được phân tách bằng dấu cách hoặc tab, thì đây là mũi khoan:

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

    điều này sẽ chuyển đổi tất cả các khoảng trắng sang dòng mới

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

Vâng, có nhiều cách để thực hiện nó, nhưng đây là một cách tiếp cận rất đơn giản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.