Listar o arquivo mais recente por subpasta

0

Eu tenho uma estrutura de arquivos de:

FOLDER/SUB_FOLDER/Text_File

Eu tenho mais de 1k + FOLDER e cada FOLDER tem pelo menos 2 SUB_FOLDER diferentes com cada SUB_FOLDER seu próprio Text_File .

Estou tentando me desafiar para gerar uma lista das mais recentes Text_File per FOLDER/ (como raiz)

My Pseudo code is (as well as commands I know right now): 
List all FOLDERS
 - **ls -t [EACH_FOLDER] | head -n1 **
    **ls -t EACH_FOLDER/SUB_FOLDER/**
      **ls Text_File**

O resultado deve ser:

/FOLDER/SUB_FOLDER/Text_File

...

todos os arquivos.

Minha meta é: preciso percorrer cada LATEST Text_File de cada raiz FOLDER para analisar as informações dela.

    
por Bain 22.04.2016 / 21:44

2 respostas

0

Com gnu , você pode tentar:

find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h
 find "$(pwd)" -depth -type f -printf "d%h
find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h
 find "$(pwd)" -depth -type f -printf "d%h%pre%%T@ %p%pre%" | awk -v RS="%pre%" '
  /^d/ {
    directoryname=substr($0,2);
  }
  /^[0-9]/ {
    if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
      lmtimes[directoryname]=$1;
      lmtimefns[directoryname]=substr($0,index($0," ")+1);
    }
  }
  END {
    for (directoryname in lmtimefns) {
      print lmtimefns[directoryname];
    }
  }'
%T@ %p%pre%" | awk -v RS="%pre%" ' /^d/ {directoryname=substr($0,2)} /^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) { lmtimes[directoryname]=$1; lmtimedns[directoryname]=substr($0,index($0," ")+1); } END {for (directoryname in lmtimedns) print lmtimedns[directoryname]} '
%T@ %p%pre%" | awk -v RS="%pre%" ' /^d/ { directoryname=substr($0,2); } /^[0-9]/ { if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) { lmtimes[directoryname]=$1; lmtimefns[directoryname]=substr($0,index($0," ")+1); } } END { for (directoryname in lmtimefns) { print lmtimefns[directoryname]; } }'
%T@ %p%pre%" | awk -v RS="%pre%" ' /^d/ {directoryname=substr($0,2)} /^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) { lmtimes[directoryname]=$1; lmtimedns[directoryname]=substr($0,index($0," ")+1); } END {for (directoryname in lmtimedns) print lmtimedns[directoryname]} '

Esta versão foi testada contra nomes estranhos que contêm caracteres especiais: \n " etc.

$(pwd) execute pwd comando que imprime o caminho absoluto do diretório atual.

find $(pwd) procura o diretório atual, os nomes completos dos diretórios serão impressos

O filtro -mindepth 2 -maxdepth 2 -type d está selecionando apenas diretórios no segundo nível em que FOLDER no diretório atual estão no nível 1 e seus SUB_FOLDER no nível 2.

-printf "d%hSUBFOLDER%T@ %pd" imprime para cada FOLDER encontrado, estas informações abaixo:

last modif time in second since EPOCH [space] SUBFOLDER awk -v RS="/^d/ {directoryname=substr($0,2)}" regex d directoryname etc.

O FOLDER não pode ser parte de um nome, então este é o delimitador perfeito.

d está considerando printf como um Separador de Registros.

/^[0-9]/ : este regex é verdadeiro quando um registro começa com printf ; A variável $1 é atualizada com o nome [space] que é feito de todos os caracteres logo após o && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) char, por construção, graças a SUBFOLDER .

FOLDER : este directoryname é verdadeiro quando um registro começa com um dígito. Por construção, graças a true , o primeiro campo ( directoryname : por exemplo, todos os caracteres até ̀ SUBFOLDER char) do registro atual contém o horário da última modificação.

FOLDER : lmtimes é um array associativo (um mapa de pares [key, value]). Ele é usado para armazenar a última hora da última modificação do atual directoryname para o atual END {for (... ( SUBFOLDER ). A expressão é %code% se ainda não houver um horário da última modificação armazenado para %code% ou se a hora da última modificação já armazenada for mais antiga que a atual %code% .

Quando a expressão posterior for verdadeira, o horário da última modificação e o nome de %code% serão armazenados usando a tecla %code% em lmtimes e lmtimedns , respectivamente .

%code% : Quando todos os registros foram analisados, cada %code% nome com a última hora da última modificação é impresso.

----

Para o histórico, o comando para listar os nomes dos arquivos com o tempo de modificação mais recente para cada diretório:

%pre%     
por 22.04.2016 / 22:33
1
#!/bin/bash

# Array of root folders
folders=("a" "b")

# Search all specified root folders
for f in ${folders[@]}; do
    # Descend hierarchy and retrieve modification date of each file with "stat"
    find $f -type f -exec stat -f "%m,%N" {} ';' | \
        # sort by date, most recent first
        sort -gr | \
        # extract first (most recent) file
        head -1 | \
        # return file name only
        cut -d, -f2
done
    
por 22.04.2016 / 22:48