Câu trả lời:
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
cat file
" trong (ba) sh hoặc csh.
cat
là 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
Đâ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 $file
và chạy rm
trên nó. Các -r
Đảm bảo rằng những dấu xồ nguợc được đọc theo nghĩa đen (để \t
phù hợp với một \
và một t
và 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 %k
hàm băm và sau đó sử dụng unlink
để xóa từng tên.
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.py
và 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ữ.
Ngớ ngẩn, nhưng đây là một:
tar -cvf /dev/null --remove-files -T filename
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
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:
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
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.
cat
không bắt buộc, bạn có thể sử dụngstdin
chuyển hướng:< file xargs rm