
Tenho nomes de arquivos em um arquivo que preciso excluir em um diretório diferente.
Digamos que eu tenha x
e y
arquivos em dir a
. Como faço para excluí-lo usando cat?
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
e a.txt
executar,
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/z
o arquivo que pode ser uma opção, pois está fixo que a
conterá apenas os arquivos. Mas a
deve 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 cat
e combine-o com xargs
:
cat a.txt | xargs -I{} rm a/{}
(embora dado o -a
recurso, seja umUso inútil de gato)
Observe que isso -I{}
implica -L 1
que 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 -I
caso em que xargs
passará 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' rm
para 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 cd
antes 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 xargs
nomes de arquivos delimitados por NUL.