Como posso evitar que argumentos para 'xargs' sejam prefixados com espaços?

1

Eu extraí um arquivo cujo conteúdo não é armazenado em um subdiretório em um diretório preenchido com outros arquivos e agora está confuso e confuso.

Para corrigir isso, eu extraí o arquivo em um novo diretório vazio e quero usar o diretório lá para excluir os arquivos do primeiro diretório que foi mesclado. Os arquivos foram originalmente extraídos para o diretório '/ usr / src / packages' e o novo diretório é ~/Programs/DBeaver .

vfclists@hp01:~/Programs/DBeaver$ ls -l
total 216
-rw-r--r--  1 vfclists vfclists 48943 Oct 23 23:28 artifacts.xml
drwxr-xr-x  4 vfclists vfclists  4096 Oct 23 23:28 configuration
-rwxr-xr-x  1 vfclists vfclists 79058 Oct 23 22:58 dbeaver
-rw-r--r--  1 vfclists vfclists   206 Oct 23 23:28 dbeaver.ini
-rw-r--r--  1 vfclists vfclists  7919 Oct  9 14:05 dbeaver.png
drwxr-xr-x 23 vfclists vfclists  4096 Oct 23 23:28 features
-rwxr-xr-x  1 vfclists vfclists 35021 Oct 23 22:58 icon.xpm
drwxr-xr-x  2 vfclists vfclists  4096 Oct 23 23:28 licenses
drwxr-xr-x  4 vfclists vfclists  4096 Oct 23 23:28 p2
drwxr-xr-x  6 vfclists vfclists 20480 Oct 23 23:28 plugins
-rw-r--r--  1 vfclists vfclists  1791 Oct 23 23:28 readme.txt
vfclists@hp01:~/Programs/DBeaver$ 

Então, o que eu quero fazer é canalizar a saída de ls para xargs, mas quando executo o comando, o nome do arquivo é prefixado com um espaço para que eu obtenha uma saída de teste assim.

vfclists@hp01:~/Programs/DBeaver$ ls  | xargs -n 1 echo rm /usr/src/packages/
rm /usr/src/packages/ artifacts.xml
rm /usr/src/packages/ configuration
rm /usr/src/packages/ dbeaver
rm /usr/src/packages/ dbeaver.ini
rm /usr/src/packages/ dbeaver.png
rm /usr/src/packages/ features
rm /usr/src/packages/ icon.xpm
rm /usr/src/packages/ licenses
rm /usr/src/packages/ p2
rm /usr/src/packages/ plugins
rm /usr/src/packages/ readme.txt

Há também a questão de distinguir entre diretórios e arquivos, mas quero lidar com isso primeiro.

UPDATE: Acontece que rm -rf funciona tão bem em arquivos quanto em diretórios, o que não importa realmente neste exemplo, então eu simplesmente tenho que substituir rm xxxx por rm -rf xxxx

    
por vfclists 24.10.2016 / 08:41

1 resposta

7

Use -I {} e {} no lugar em que você deseja que o argumento apareça:

xargs -I {} -n 1 echo rm /usr/src/packages/{}

(Você pode usar algo diferente de {} , {} é muito comum.)

Sem isso, xargs simpy adiciona a entrada como argumentos adicionais, portanto, não é uma questão de adicionar espaços em qualquer lugar - o comando recebe a entrada como argumentos separados.

Você provavelmente deve usar find em vez de ls , especialmente se quiser distinguir arquivos e diretórios.

Algo como isto para excluir apenas arquivos:

find . -type f -exec rm /usr/src/packages/{} \;
    
por 24.10.2016 / 08:47

Tags