Odpowiedzi:
Użyj xargs
:
xargs rm < file # or
xargs -a file rm
Ale to nie zadziała, jeśli nazwy / ścieżki plików zawierają znaki, które należy usunąć.
Jeśli twoje nazwy plików nie mają nowych linii, możesz:
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
Alternatywnie możesz utworzyć następujący skrypt:
#!/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"
Zapisz jako /usr/local/bin/delete-from
, udziel uprawnienia do wykonania:
sudo chmod +x /usr/local/bin/delete-from
Następnie uruchom go z:
delete-from /path/to/file/with/list/of/files
cat file
” w (ba) sh lub csh.
cat
jest bezużyteczny , jak już wspomniano, skorzystaj z stdin
! Spójrz na jego zaktualizowaną odpowiedź
Oto jeden ze sposobów radzenia sobie z nazwami plików z białymi znakami, odwrotnymi ukośnikami i innymi dziwnymi znakami:
while read -r file; do rm -- "$file"; done < list.txt
To przeczyta każdy wiersz list.txt
, zapisz go jako $file
i uruchom rm
na nim. W -r
gwarantuje, że backslashe dosłownie czytać (tak, że \t
dopasowuje \
a t
, a nie karta). W --
zapewnia, że zajmuje się również nazwy plików zaczynające się -
.
Możesz to również zrobić w Perlu:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
Ten wczyta każdą nazwę pliku do %k
skrótu, a następnie użyje unlink
do usunięcia każdego z nich.
Poprzez python.
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
Zapisz powyższy skrypt w pliku o nazwie like, script.py
a następnie uruchom skrypt, uruchamiając poniższe polecenie na terminalu.
python3 script.py file
file
to plik wejściowy, w którym przechowywana jest ścieżka plików, które chcesz usunąć.
Inny sposób to zrobić:
Możesz „przygotować” plik, tworząc skrypt powłoki:
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
Jeśli twoje nazwy plików mogą zawierać pojedynczą cudzysłów ( '
), możesz użyć tej nieco rozszerzonej wersji, aby uciec przed nimi:
$ 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'\'''
Możesz to uruchomić, przesyłając go do sh
:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
Jak rozumiem, masz plik tekstowy z plikami z pełnymi ścieżkami. Istnieją dwie możliwości:
Twoja lista ma nazwy plików oddzielone znakami nowej linii, tzn. Każda linia ma pełną ścieżkę do pliku. w tym przypadku: oto proste wyjście:
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Jeśli lista zawiera jeden lub więcej wierszy nazw plików oddzielonych spacjami lub tabulatorami, oto ćwiczenie:
sed -i 's/\s\+/\n/g' listOfFiles.txt
spowoduje to konwersję wszystkich białych znaków do nowych linii
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Tak, istnieje wiele sposobów, aby to zrobić, ale jest to bardzo proste podejście.
cat
nie jest wymagana, możesz użyćstdin
przekierowania:< file xargs rm