Dando saída de gato para rm

0

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

Digamos que eu tenha arquivos x e y em dir a . Como faço para excluí-lo usando cat?

Eu tentei

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

a.txt tem conteúdo x,y,z .

Se eles estiverem na mesma pasta, posso colocar x y z em a.txt e executar,

rm -f 'cat a.txt'

que funciona bem.

Eu também tentei,

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

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

Eu não quero colocar a/x a/y a/z no arquivo que pode ser uma opção, pois é fixo que a conterá apenas os arquivos. Mas a deve ser alterado apenas no dockerfile. Obrigado por todas as sugestões com antecedência:)

    
por Optimus Prime 29.06.2017 / 08:15

3 respostas

1

Supondo que seus nomes de arquivos não contenham espaços ou nenhum caractere especial, apenas reutilize seu comando original com cd antes dele:

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

Esteja avisado que rm -f 'cat a.txt' se rompe facilmente com espaços ou qualquer caractere especial em nomes de arquivos, você deve usar xargs com nomes de arquivos delimitados por NUL.

    
por muru 29.06.2017 / 08:31
2

Você deve usar while loop para ler o arquivo linha por linha e depois aplicar cada linha a rm . Essa é uma abordagem muito comum e usada com frequência no script

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

    
por Sergiy Kolodyazhnyy 29.06.2017 / 08:25
1

Não tente usar $(cat file) para esse tipo de coisa - será quebrado, por exemplo, se houver espaços nos nomes dos arquivos, por exemplo. dado

$ 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 usar xargs

$ 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ê realmente quiser usar cat , combine-o com xargs :

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

(apesar de receber o recurso -a , é um Uso inútil do gato )

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

    
por steeldriver 29.06.2017 / 13:20