Dando salida de gato a rm

Dando salida de gato a rm

Tengo nombres de archivos en un archivo que necesito eliminar en un directorio diferente.

Digamos que tengo archivos xy yen dir a. ¿Cómo lo elimino usando cat?

Lo intenté,

rm -f a/{`cat a.txt`}

a.txttiene contenidos x,y,z.

Si están en la misma carpeta, puedo colocarlos x y zy a.txtejecutarlos.

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/zel archivo, lo cual puede ser una opción, ya que está arreglado que asolo contendrá los archivos. Pero adebe 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 -acaracterística, es unUso inútil del gato)


Tenga en cuenta que esto -I{}implica -L 1que ie rmse 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 -Ien cuyo caso xargsse 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' rmpara 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 cdantes:

(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 xargscon nombres de archivos delimitados por NUL.

información relacionada