Excluir linhas com padrão específico [closed]

0

Eu quero excluir a linha com um padrão específico.

-rw-rw-r-- 1 user1 user1   10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw------- 1 user1 user1    0 Oct 27 11:17 ./folder1/folder2/.test-file1-228783-cause1-XY-OP-0001.pdf.lyWfRr
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw------- 1 user1 user1    0 Oct 27 11:19 ./folder1/folder2/.test-file3-228706-cause1-XY-OP-0005.pdf.GftyJL
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Do conjunto de linhas acima, deseja excluir a linha abaixo

-rw------- 1 user1 user1    0 Oct 27 11:17 ./folder1/folder2/.test-file1-228783-cause1-XY-OP-0001.pdf.lyWfRr
-rw------- 1 user1 user1    0 Oct 27 11:19 ./folder1/folder2/.test-file3-228706-cause1-XY-OP-0005.pdf.GftyJL

Por favor, deixe-me saber como fazer isso.

Obrigado

    
por mr au 27.10.2017 / 20:18

3 respostas

1

Suponho que este texto esteja armazenado em um arquivo, digamos ls_l_out.txt .

Eu não sei como você deseja que a correspondência de padrões seja feita, mas a coisa mais simples que eu vejo é combinar as permissões.

Então, com isso em mente, você pode usar este comando sed:

$ sed '/^-rw-------/d' ls_l_out.txt
-rw-rw-r-- 1 user1 user1   10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Se você executar isso e a saída parecer boa, você poderá editar o arquivo no local com o sinalizador -i para sed:

$ sed -i '/^-rw-------/d' ls_l_out.txt
    
por wjandrea 27.10.2017 / 20:35
1

Aparece da sua saída que você executou o comando

$ ls -la ./folder1/folder2/

ou algo semelhante ao longo das linhas, e sua pergunta pede para analisar a saída de ls . No entanto, você realmente não deve analisar ls , porque é uma má prática por várias razões. Melhor abordagem seria esta:

$ ls ./folder1/folder2/{"",.}test*pdf

A expansão do nome do caminho pegará apenas arquivos que começam com test e terminam com pdf e que podem ou não começar com um ponto. Seus arquivos que terminam com lyWfRr e GftyJL não serão exibidos dessa maneira.

No entanto, se você insistir em analisar essa saída, use $ anchor em awk para filtrar as linhas que terminam apenas em .pdf

$ awk '/pdf$/' input.txt                                                                                                                                               
-rw-rw-r-- 1 user1 user1   10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1   20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf

Para o registro, não tolero isso, incentivo os usuários a evitar ls de análise e fazer as coisas do jeito certo TM

    
por Sergiy Kolodyazhnyy 27.10.2017 / 20:58
0

Embora as respostas atuais sejam válidas, elas podem ser problemáticas se você trabalhar com uma quantidade extremamente grande de arquivos (acima de 30k). Neste caso, sugiro usar o find:

find ./folder1/folder2 -maxdepth 0 -type f -name ".test-file*-*-cause1-XY-OP-*.pdf.*" -delete

EDITAR: Estou supondo que você deseja excluir arquivos e não atualizar o conteúdo de um arquivo. Nesse caso, ir com sed, awk ou grep é a única opção e, portanto, você deve evitar essa resposta.

    
por Ste 'tbx' 27.10.2017 / 21:11