Conteúdo de piping com múltiplos espaços

2

Eu estava tentando copiar arquivos listados em um arquivo de texto em um diretório como:

cat files.txt | xargs  -I{} cp "{}" ~/Desktop/temp

No entanto, notei que alguns arquivos não seriam copiados. Os arquivos que não copiaram tinham espaços duplos no nome, como "My Document.pdf".

Eu fiz um pequeno teste e simplesmente piping um eco remove todos os espaços, exceto por um. Por exemplo:

echo "Hello         World" | xargs echo

simplesmente retorna

Hello World

Existe uma maneira quando a tubulação diz para preservar os espaços em branco existentes no conteúdo?

    
por Scott Walter 02.07.2014 / 00:50

3 respostas

1

xargs faz uma quantidade infeliz de análise em sua entrada e, dependendo de quais caracteres ocorrem em nomes de arquivos (espaços, citações / apóstrofos, barras invertidas, tabulações, etc), pode manipulá-los de várias maneiras. A melhor maneira de manipular nomes de arquivos é como uma lista delimitada por nulo e usando xargs -0 (que desativa toda a análise). Se a lista de arquivos fosse gerada a partir de find , isso seria fácil (basta usar -print0 ). Como você está lidando com a saída de um script perl, vejo duas opções: modificar o script perl para gerar valores nulos em vez de feeds de linha ou, se não for possível, convertê-los no pipeline com tr :

cat files.txt | tr "\n" "
cat files.txt | tr "\n" "%pre%" | xargs -0 -I{} cp "{}" ~/Desktop/temp
" | xargs -0 -I{} cp "{}" ~/Desktop/temp
    
por 03.07.2014 / 01:54
1

Eu encontrei uma solução na qual eu precisava substituir um espaço com uma barra invertida e um espaço no OS X. Aqui está o que eu criei:

echo "Hello        World" | sed 's/ /\ /g' | xargs echo

Com isso, todos os espaços são mantidos.

    
por 02.07.2014 / 17:22
0

Você pode usar um loop while :

while IFS= read -r _file
do
    cp "$_file" ~/Desktop/temp
done < "files.txt"

IFS é definido como nulo, porque nenhuma divisão é executada e -r informa o caractere de barra invertida de escapes bash.

    
por 03.07.2014 / 07:37

Tags