Estou fazendo um script LRU, mas depois de 20 horas trabalhando nele, tenho um problema com o modo recursivo que não consigo resolver.
Eu só preciso de um comando que me mostre os arquivos classificados por tempo de acesso (--time=atime); Quero gerenciar a profundidade também, mas se não conseguir, tudo bem também.
- Diretório principal:
- Arquivo 1
- Diretório 1:
- Arquivo 1
- Arquivo2
- Subdiretório 1:
- arquivo1
- arquivo 2
- Diretório 2:
- Arquivo 1
- Arquivo 2
- Subdiretório 2:
- arquivo 1
- arquivo 2
- subdiretório 3:
- arquivo 1
Quero excluir o diretório, apenas ordenando o arquivo por tempo de acesso
como
/Diretório Principal/Diretório 1/arquivo 1
/Diretório Principal/Arquivo 1
/Diretório Principal/Diretório 1/Subdiretório 1/arquivo 2
/Diretório Principal/Diretório 2/Subdiretório 2/subdiretório 3/arquivo 1
etc..
Responder1
Existem seis ferramentas muito usadas para resolver problemas semelhantes:
find
, para procurar arquivos ou diretórios que correspondam a entradas específicas.As opções
-mindepth
e-maxdepth
controlam a profundidade na árvore do sistema de arquivos (em relação aos nomes especificados, que estão sempre na profundidade 0) em que o comando funcionará.A
-type
opção é útil para restringir a consideração de arquivos, diretórios, links simbólicos ou dispositivos.A
-printf
opção é extremamente útil, pois faz com que o comando imprima as informações dos nomes correspondentes (itens de diretório) no formato desejado. Gosto particularmente do%TY%Tm%Td %TT %p\n
, que imprime a data e hora da última modificação, e caminho completo e nome de cada correspondência em cada linha, usando formatYYYYMMDD HH:MM:SS.sss PATH
. Este formato é classificado corretamente, você vê. Para o último acesso, use%AY%Am%Ad %AT %p\n
, mas observe que os carimbos de data e hora de acesso não serão registrados senoatime
a opção de montagem for usada, ou serelatime
a opção de montagem for usada, os carimbos de data e hora de acesso serão modificados apenas para o primeiro acesso após uma modificação; a verificação usada menos recentemente não é, portanto, confiável. (A lista menos modificada recentemente, no entanto, é bastante confiável; os usuários podem modificar os carimbos de data e hora manualmente, mas, caso contrário, eles serão mantidos automaticamente.)sort
para classificar a saída.As opções
-d
,-g
,-h
,-M
e-n
definem como os itens são comparados e a-R
opção torna o pedido aleatório.A
-r
opção pode ser usada para reverter a ordem de classificação (usada além de uma das opções acima).A
-t
opção redefine como os campos (colunas) são definidos; por padrão, espaços em branco (espaços e tabulações) separam colunas.A
-k
opção pode ser utilizada para definir qual parte de cada linha é considerada a chave de classificação; por padrão, toda a linha é considerada.uniq
é frequentemente usado após a classificação para combinar vários itens consecutivos em um - para que apenas as linhas exclusivas sejam geradas.cut
é a maneira mais simples de escolher apenas colunas específicas de cada linha da saída.A
-f
opção escolhe os campos a serem impressos. (Por padrão, são impressas linhas com no máximo um campo (sem separadores); a opção-s
suprime a impressão de tais linhas.)A
-d
opção pode ser utilizada para redefinir a definição de um campo; por padrão, os campos separados ficam em branco.sed
é um poderoso editor de stream, que se aplicaexpressões regularesà entrada, filtrando e modificando-a conforme necessário.awk
é um intérprete para a linguagem awk. Os scripts Awk são basicamente coleções deações, trechos de código que são executados para cada linha (ou antes ou depois de todo o processamento, ou se a linha (ou registro) corresponder a alguma regra).
Este problema específico pode ser resolvido usando três dos comandos acima em um pipeline simples: use find
para localizar arquivos nas profundidades desejadas da árvore, imprimindo uma data e hora classificáveis para cada arquivo, além do caminho relativo para o arquivo; classifique a saída; remova a parte de data e hora de cada linha, deixando apenas o caminho relativo para cada arquivo em cada linha.
Responder2
De longe, o método mais fácil é usarzsh. Isso éeliminatórias globaispode combinar e classificar arquivos com base em seu tipo, carimbos de data e hora e outras propriedades.
print -lr -- *(.Doa)
print -lr -- **/*(.Doa)
O primeiro comando imprime os nomes dos arquivos regulares ( .
) no diretório atual, incluindo arquivos de ponto ( D
) classificados por tempo de acesso ( oa
). O segundo comando lista os arquivos no diretório atual e em seus subdiretórios recursivamente.