Respuestas:
Uso xargs
:
xargs rm < file # or
xargs -a file rm
Pero eso no funcionará si los nombres / rutas de archivo contienen caracteres que se deben escapar.
Si sus nombres de archivo no tienen líneas nuevas, puede hacer:
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
Alternativamente, puede crear el siguiente 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"
Guárdelo como /usr/local/bin/delete-from
, otorgue permiso de ejecución:
sudo chmod +x /usr/local/bin/delete-from
Luego ejecútalo con:
delete-from /path/to/file/with/list/of/files
cat file
" en (ba) sh o csh.
cat
es útil , como acabo de decir, ¡aprovecha stdin
! Mire su respuesta actualizada
Aquí hay una forma de tratar los nombres de archivos con espacios en blanco, barras diagonales invertidas y otros caracteres extraños:
while read -r file; do rm -- "$file"; done < list.txt
Eso leerá cada línea list.txt
, la guardará como $file
y se ejecutará rm
en ella. Las -r
asegura que las barras invertidas se leen literalmente (de modo que \t
coincide con una \
y una t
y no un TAB). El --
asegura que también trata con nombres de archivos que comienzan con -
.
También puedes hacer esto en Perl:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
Este leerá cada nombre de archivo en el %k
hash y luego lo usará unlink
para eliminar cada uno de ellos.
A través de pitón.
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
Guarde el script anterior en un archivo llamado like script.py
y luego ejecute el script disparando el siguiente comando en la terminal.
python3 script.py file
file
es un archivo de entrada donde se almacena la ruta de los archivos que realmente desea eliminar.
Otra forma de hacer esto:
Puede 'preparar' el archivo convirtiéndolo en un script de shell:
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
Si sus nombres de archivo pueden tener una comilla simple ( '
), puede usar esta versión ligeramente expandida para escapar de ellos primero:
$ 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'\'''
Y puede ejecutar esto canalizándolo a sh
:
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
Según tengo entendido, tiene un archivo de texto con los archivos con las rutas completas. Hay dos posibilidades:
Su lista tiene los nombres de archivo separados por nuevas líneas, es decir, cada línea tiene la ruta completa a un archivo. en este caso: aquí hay una salida simple:
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Si su lista tiene una o más líneas de nombres de archivos separados por espacios o pestañas, entonces aquí está el ejercicio:
sed -i 's/\s\+/\n/g' listOfFiles.txt
esto convertirá todos los espacios en blanco en líneas nuevas
for i in $(cat listOfFiles.txt); do
rm -f $i
done
Sí, hay muchas formas de hacerlo, pero este es un enfoque muy simple.
cat
no es obligatorio, puede usar lastdin
redirección:< file xargs rm