xargs não pode manipular espaços em linhas [closed]

1

Todos os arquivos de destino foram excluídos. Claro, quando tento executar qualquer exclusão novamente, os arquivos não estão lá para serem excluídos. Desculpe pelo seu tempo.

Estou usando o bash no cygwin.

Eu tenho a saída de fdupes em um arquivo. Eu estou grepping a saída para excluir um diretório que eu quero manter intacto, e querendo apagar o resto dos arquivos listados.

Eu tenho algumas entradas com espaços:

./NewVolume/keep/2009/conference/conference/conference 004.jpg

Que desce xargs :

$ cat real-dupes.txt |xargs rm {}
...
rm: cannot remove ‘2009/conference/conference/conference’: No such file or directory'

Quando eu tento a opção -0 , parece que as linhas ficam agrupadas:

$ cat real-dupes.txt |xargs -0 rm
xargs: argument line too long

Outras perguntas têm respostas em que o consulente é aconselhado a usar find para alimentar os argumentos em xargs . Isso não é útil no meu cenário, porque não acredito que possa usar facilmente find para identificar as duplicatas das quais quero me livrar. Além disso, o trabalho do fdupes foi executado por mais de 12 horas, então eu realmente quero usar esse conjunto de dados.

Até onde eu sei, fdupes não pode excluir um diretório de sua exclusão automática, então não posso usá-lo fora da caixa.

    
por user394 29.12.2015 / 23:56

2 respostas

4

xargs -0 não está funcionando porque espera uma cadeia terminada com nulo, o que não é encontrada, portanto, lendo toda a entrada e globbing seu argumento.

Basta converter cada nova linha (suponho que exista um nome de arquivo por linha) com um %code% , assim:

cat real-dupes.txt | tr '\n' '
cat real-dupes.txt | tr '\n' '%pre%' | xargs -0 rm {}
' | xargs -0 rm {}
    
por 30.12.2015 / 00:07
2

Por padrão, xargs divide no espaço em branco. Você pode usar os não-padrão -0 opção para dividir o caractere find ... -print00 , mas sua entrada deve estar preparada para corresponder à expectativa. ( find é uma das maneiras de fazer isso - supondo que sua versão de -print0 tenha a opção xargs ).

Desde que nenhum dos seus arquivos contenha uma nova linha em seu nome (ou seja, você tem um arquivo por linha), você pode usar xargs da seguinte forma:

xargs -I{} rm {} <real-dupes.txt

A página man do -I tem isto a dizer sobre o %code% flag:

-I replace-str Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.

    
por 30.12.2015 / 00:07

Tags