
Extraí um arquivo cujo conteúdo não está armazenado em um subdiretório em um diretório preenchido com outros arquivos e agora está desordenado e confuso.
Para corrigir isso, extraí o arquivo para um novo diretório vazio e quero usar o diretório listado lá para excluir os arquivos do primeiro diretório que foi misturado. 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 ls
para xargs, mas quando executo o comando, o nome do arquivo é anexado com um espaço, então obtenho uma saída de teste como esta.
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 da distinção entre diretórios e arquivos, mas quero tratar disso primeiro.
ATUALIZAÇÃO: Acontece que rm -rf
funciona tão bem em arquivos quanto em diretórios, mas isso realmente não importa neste caso, então eu simplesmente tenho que substituir rm xxxx
porrm -rf xxxx
Responder1
Use -I {}
, e {}
no local onde 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
o 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 deveria usar find
em vez de ls
, especialmente se quiser distinguir arquivos e diretórios.
Algo assim para excluir apenas arquivos:
find . -type f -exec rm /usr/src/packages/{} \;