Dando saída de gato para rm

Dando saída de gato para rm

Tenho nomes de arquivos em um arquivo que preciso excluir em um diretório diferente.

Digamos que eu tenha xe yarquivos em dir a. Como faço para excluí-lo usando cat?

Tentei,

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

a.txttem conteúdo x,y,z.

Se eles estiverem na mesma pasta, posso colocar x y ze a.txtexecutar,

rm -f `cat a.txt`

o que funciona bem.

Eu também tentei,

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

Este comando irá em um dockerfile, então prefiro não usar nenhuma variável também.

EUnãoquero colocar a/x a/y a/zo arquivo que pode ser uma opção, pois está fixo que aconterá apenas os arquivos. Mas adeve ser alterado apenas no dockerfile. Obrigado por todas as sugestões antecipadamente :)

Responder1

Você deve usar o loop while para ler o arquivo linha por linha e depois aplicar cada linha ao arquivo rm. Esta é uma abordagem muito comum e frequentemente usada em scripts

while IFS= read -r line
do
       rm a/"$line"
done < file.txt

Naturalmente o formato do arquivo deve ser uma lista de arquivos com um arquivo por linha

Responder2

Não tente usar $(cat file)para esse tipo de coisa - ele irá quebrar, por exemplo, se houver espaços nos nomes dos arquivos, por exemplo, dados

$ cat a.txt 
foo
bar baz
bam

e

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"

então

$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory

Em vez disso, você pode usarxargs

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file"  "somefile"

Se vocêrealmentedeseja usar cate combine-o com xargs:

cat a.txt | xargs -I{} rm a/{}

(embora dado o -arecurso, seja umUso inútil de gato)


Observe que isso -I{}implica -L 1que ie rmé invocado uma vez para cada linha do arquivo de entrada; se você não precisar acrescentar um caminho de diretório, poderá tornar o comando mais eficiente eliminando o -Icaso em que xargspassará vários argumentos para rm. No entanto, nesse caso, você deve definir explicitamente o delimitador de entrada como nova linha, por exemplo, xargs -a a.txt -d '\n' rmpara evitar quebras de espaços.

Responder3

Supondo que seus nomes de arquivos não contenham espaços ou caracteres especiais, apenas reutilize seu comando original com um cdantes dele:

(cd a; rm -f $(cat a.txt))

Esteja avisado que rm -f `cat a.txt`quebra facilmente com espaços ou quaisquer caracteres especiais em nomes de arquivos, você realmente deve usar xargsnomes de arquivos delimitados por NUL.

informação relacionada