Jawaban:
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
cat file
" di (ba) sh atau csh.
cat
tidak berguna, seperti yang baru saja disebutkan, manfaatkan dari stdin
! Lihatlah jawabannya yang diperbarui
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 $file
dan jalankan rm
di atasnya. The -r
memastikan bahwa backslashes dibaca secara harfiah (sehingga \t
cocok dengan \
dan t
dan 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 %k
hash dan kemudian gunakan unlink
untuk menghapus masing-masing nama.
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.py
dan 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.
Konyol, tapi ini satu:
tar -cvf /dev/null --remove-files -T filename
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
Seperti yang saya pahami, Anda memiliki file teks dengan file dengan path lengkap. Ada dua kemungkinan:
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
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.
cat
tidak diharuskan, Anda dapat menggunakanstdin
redirection:< file xargs rm