Como posso combinar listagens de arquivos usando sed?

0

Desejo listar os arquivos de algumas pastas, em ordem alfabética inversa, e agregar esses dados em um único arquivo ( AllDirectoriesFileInfo.txt ). Eu já descobri a classificação; agora é apenas agrupar a informação que está me enganando. Aqui está o que eu tenho até agora:

ls -r /home/tony/Desktop/jpgfolder > AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/giffolder > AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/docxfolder > AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/dregsfolder > AllDirectoriesFileInfo.txt

No entanto, após a inspeção de AllDirectoriesFileInfo.txt , apenas as informações de dregsfolder estão presentes, levando-me a concluir que os dados anteriores foram sobrescritos com cada comando.

Então, estou ciente de que sed pode adicionar / inserir texto.

Inicialmente eu estava inclinado a usar a ;

The syntax is as simple, simply designate the line after which a new line is to be inserted by using its corresponding number or a pattern.

No entanto, para mim, especificar um número de linha é problemático. Digamos que eu especifique a linha 50, haverá um enorme deserto de espaço em branco? Ou dizer que um arquivo maior é utilizado e, em seguida, a informação fica confusa?

Estou ciente de que com o comando i (inserir), o usuário pode especificar o ponto no qual o novo texto é inserido.

Meu pensamento e pseudocódigo são os seguintes:

All information of folder 1 stored here
**END of folder 1 info**
All information of folder 2 stored here

E a partir daí, use o SED para inserir o próximo arquivo após o término da pasta 1 info

Isso funcionaria? Ou estou latindo para a lua aqui?

    
por IronUhlan 10.11.2017 / 20:42

1 resposta

3

Você está latindo para a lua. Basta usar o redirecionador de acréscimo >> em vez do redirecionador de gravação > :

touch AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/jpgfolder >> AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/giffolder >> AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/docxfolder >> AllDirectoriesFileInfo.txt
ls -r /home/tony/Desktop/dregsfolder >> AllDirectoriesFileInfo.txt

Ou esqueça de anexar e apenas dê ls vários argumentos:

ls -r /home/tony/Desktop/jpgfolder /home/tony/Desktop/giffolder /home/tony/Desktop/docxfolder /home/tony/Desktop/dregsfolder >> AllDirectoriesFileInfo.txt

Simplificado:

ls -r ~tony/Desktop/{jpgfolder,giffolder,docxfolder,dregsfolder} >> AllDirectoriesFileInfo.txt

Ainda mais curto, assumindo que tony é seu nome de usuário:

ls -r ~/Desktop/{jpg,gif,docx,dregs}folder >> AllDirectoriesFileInfo.txt

Embora, se você estiver fazendo algum processamento nos dados do arquivo, você vai querer usar find ao invés de ls , já que em geral, ls dá saída para humanos lerem e find fornece saída para os computadores lerem. Especificamente neste caso, find lista o arquivo e seu caminho juntos.

Aqui está um exemplo rápido:

$ mkdir dir1 dir2
$ touch {dir1,dir2}/file1
$ ls -r dir1 dir2 > ls_r_out.txt

Agora, digamos que eu queira pesquisar "file1":

$ grep 'file1$' ls_r_out.txt
file1
file1

OK, isso não é muito útil, porque não me diz onde estão os arquivos. Vou tentar o mesmo processo com find . Agora, find não suporta classificação, por isso vou ter que percorrer sort :

$ find dir1 dir2 | sort -r > find_reverse_out.txt
$ grep 'file1$' find_reverse_out.txt 
dir2/file1
dir1/file1

Voila. Observe que isso fica mais complicado se os nomes dos arquivos contiverem caracteres especiais, como novas linhas.

    
por wjandrea 10.11.2017 / 20:49