
Tengo nombres de archivos en un archivo que necesito eliminar en un directorio diferente.
Digamos que tengo archivos x
y y
en dir a
. ¿Cómo lo elimino usando cat?
Lo intenté,
rm -f a/{`cat a.txt`}
a.txt
tiene contenidos x,y,z
.
Si están en la misma carpeta, puedo colocarlos x y z
y a.txt
ejecutarlos.
rm -f `cat a.txt`
que funciona bien.
Yo también lo he intentado,
rm -f "a/{"`cat a.txt`"}"
Este comando irá en un archivo acoplable, por lo que prefiero no usar ninguna variable también.
InoQuiero poner a/x a/y a/z
el archivo, lo cual puede ser una opción, ya que está arreglado que a
solo contendrá los archivos. Pero a
debe cambiarse solo en el archivo acoplable. Gracias por todas las sugerencias de antemano :)
Respuesta1
Debe usar el bucle while para leer el archivo línea por línea y luego aplicar cada línea a rm
. Este es un enfoque muy común y de uso frecuente en secuencias de comandos.
while IFS= read -r line
do
rm a/"$line"
done < file.txt
Naturalmente, el formato del archivo debe ser una lista de archivos con un archivo por línea.
Respuesta2
No intente usarlo $(cat file)
para este tipo de cosas; se romperá, por ejemplo, si hay espacios en los nombres de los archivos, por ejemplo, dados.
$ cat a.txt
foo
bar baz
bam
y
$ ls -Q a
"bam" "bar baz" "foo" "other file" "somefile"
entonces
$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory
En su lugar, puedes utilizarxargs
$ ls -Q a
"bam" "bar baz" "foo" "other file" "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file" "somefile"
Si usteden realidaddesea utilizar cat
, luego combínelo con xargs
:
cat a.txt | xargs -I{} rm a/{}
(aunque dada la -a
característica, es unUso inútil del gato)
Tenga en cuenta que esto -I{}
implica -L 1
que ie rm
se invoca una vez por cada línea del archivo de entrada; Si no necesita anteponer una ruta de directorio, puede hacer que el comando sea más eficiente eliminando -I
en cuyo caso xargs
se pasarán múltiples argumentos a rm
. Sin embargo, en ese caso, debe establecer explícitamente el delimitador de entrada en nueva línea, por ejemplo, xargs -a a.txt -d '\n' rm
para evitar que se rompan los espacios.
Respuesta3
Suponiendo que sus nombres de archivos no contengan espacios ni caracteres especiales, simplemente reutilice su comando original con un cd
antes:
(cd a; rm -f $(cat a.txt))
Tenga en cuenta que rm -f `cat a.txt`
se rompe fácilmente con espacios o caracteres especiales en los nombres de archivos; realmente debería usarlo xargs
con nombres de archivos delimitados por NUL.