Como remover diretórios na ordem correta para que os vazios sejam removidos?

1

Eu tenho uma lista de arquivos & diretórios em um arquivo em alguma ordem, e eu quero escrever um script que os remova.

Os diretórios são somente supostamente removidos se todos os seus descendentes também forem removidos.
(Dito de outro modo, eles só devem ser removidos se estiverem vazios depois que o script for executado várias vezes.)

Eu realmente prefiro fazer isso em 1 passe.
Mas fazer isso em 1 passe parece exigir fazer as coisas em uma ordem correta (passagem pós-ordem).

Eu assumo que este é um problema conhecido ... como as pessoas geralmente resolvem isso em um script de shell?

    
por Mehrdad 27.11.2016 / 23:37

3 respostas

1

I assume this is a known problem... how do people generally solve it in a shell script?

Eles passam a lista de arquivos e diretórios para sort -r .

Se você estiver obtendo a lista de arquivos e diretórios de find , também poderá usar a opção -depth para garantir a passagem pós-ordem.

    
por 28.11.2016 / 00:29
0

Você pode tentar encomendar os arquivos pelo número de barras (descendente), desta forma você deve resolver o problema de ordenação.

    
por 28.11.2016 / 01:34
0

Não importa, eu descobri de forma independente.

Isso pode ser feito com awk . Note que esta solução faz não tolerar novas linhas no nome do arquivo.

awk -- '{a=$$0;b=$$0;print(gsub("/","/",a)-sub(/\/$$/,"aaa",b),$$0)}' INPUT_FILE.txt \
    |  "$(call Q2,/usr/bin/sort)" -k1,1nr \
    |  cut -d " " -f 2-

E enquanto estou aqui, as linhas podem ser duplicadas por meio do seguinte:

awk -- '{pos[$$0] = NR} END { for(key in pos) reverse[pos[key]] = key; for(nr=1;nr<=NR;nr++) if(nr in reverse) print reverse[nr] }' INPUT_FILE.txt

Observe que a desduplicação é crítica para evitar a explosão exponencial de tempo se você acabar sendo recursivo.

    
por 28.11.2016 / 02:27