Risposte:
Utilizzare xargs
:
xargs rm < file # or
xargs -a file rm
Ma ciò non funzionerà se i nomi / percorsi dei file contengono caratteri che devono essere salvati.
Se i tuoi nomi di file non hanno nuove righe, puoi fare:
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
In alternativa, puoi creare il seguente script:
#!/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"
Salvalo come /usr/local/bin/delete-from
, concedi l'autorizzazione all'esecuzione:
sudo chmod +x /usr/local/bin/delete-from
Quindi eseguilo con:
delete-from /path/to/file/with/list/of/files
cat file
" in (ba) sh o csh.
cat
è inutile, come appena detto, approfittane stdin
! Guarda la sua risposta aggiornata
Ecco un modo per gestire i nomi dei file con spazi bianchi, barre rovesciate e altri strani caratteri:
while read -r file; do rm -- "$file"; done < list.txt
Questo leggerà ogni riga di list.txt
, la salverà come $file
e verrà eseguita rm
su di essa. Le -r
assicura che backslash vengono letti letteralmente (in modo che \t
corrisponde a un \
e un t
e non un TAB). Le --
assicura che si occupa anche di nomi di file che iniziano con -
.
Puoi farlo anche in Perl:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
Questo leggerà ogni nome di file %k
nell'hash e quindi lo userà unlink
per eliminarli.
Attraverso il pitone.
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
Salvare lo script sopra in un file chiamato like script.py
e quindi eseguire lo script lanciando il comando seguente sul terminale.
python3 script.py file
file
è un file di input in cui sono memorizzati il percorso dei file che si desidera effettivamente rimuovere.
Un altro modo per farlo:
Puoi "preparare" il file rendendolo uno script di shell:
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
Se i tuoi nomi di file possono avere una sola virgoletta ( '
), puoi usare questa versione leggermente espansa per sfuggire loro prima:
$ 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'\'''
E puoi eseguirlo eseguendo il piping a sh
:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
A quanto ho capito, hai un file di testo con i file con i percorsi completi. Vi sono due possibilità:
Il tuo elenco ha i nomi di file separati da nuove righe, ovvero ogni riga ha il percorso completo di un file. in questo caso: ecco una semplice via d'uscita:
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Se il tuo elenco ha una o più righe di nomi di file separate da spazi o tabulazioni, ecco il tutorial:
sed -i 's/\s\+/\n/g' listOfFiles.txt
questo convertirà tutti gli spazi bianchi in newline
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Sì, ci sono molti modi per farlo, ma questo è un approccio molto semplice.
cat
non obbligatoria, puoi usare ilstdin
reindirizzamento:< file xargs rm