localize os maiores arquivos mais recentes modificados de / dirA / file, / dirB / file

4

Suponha que temos dois diretórios, dirA, dirB, que são exatamente os mesmos arquivos PDF, apenas modificados pela última vez.

O que é um script bash (sem awk) que pode pesquisar em cada nome de arquivo (assume sempre em dirA, dirB) e para cada nome de arquivo, gera qual dos arquivos (dirA / file ou dirB / file) tem maior última modificação; arquivo modificado por último? por exemplo.

if dirA/file.lastmodified > dirB/file.lastmodified 
##take action
    
por T. Webster 04.02.2013 / 10:38

3 respostas

3

Com o atributo GNU:

shopt -s dotglob

for file in dirA/*; do
    [[ -f "dirB/${file##*/}" ]] || continue
    if (( "$(stat -c %Y "$file")" > "$(stat -c %Y "dirB/${file##*/}")" )); then
        # take action
    fi
done
    
por 04.02.2013 / 10:46
1

Bash, ksh, zsh e até mesmo cinza têm um operador -nt para o [ builtin (e no bash / ksh / zsh o [[ … ]] construct) que testa se um arquivo é mais novo que outro.

for x in dirA/*; do
  y=dirB/${x#*/}
  if [ "$x" -nt "$y" ]; then
    # The file in dirA is more recent
  elif [ "$y" -nt "$x" ]
    # The file in dirB is more recent
  else
    # The two files have the same modification time
    # or the file doesn't exist in dirB
  fi
done
    
por 05.02.2013 / 01:49
0

Uma possível solução com ferramentas GNU:

find dirA dirB -type f -printf '%T@/%p
find dirA dirB -type f -printf '%T@/%p%pre%' |
  tr '\n%pre%\t/' '%pre%\n/\t' |
  sort -k3 -k1,1rg |
  uniq -f2 |
  cut -f2- |
  tr '%pre%/\t' '\n\t/'
' | tr '\n%pre%\t/' '%pre%\n/\t' | sort -k3 -k1,1rg | uniq -f2 | cut -f2- | tr '%pre%/\t' '\n\t/'

Informaria todos os arquivos em dirA e dirB (e em seus subdiretórios), exceto que, se um arquivo é comum a ambos, somente os mais novos (ou se tiverem a mesma idade, qualquer um deles aleatoriamente).

Isso só funciona para valores de dirA e dirB como "dirA" , ou seja, não contêm caracteres em branco ou barra, embora não haja restrições nos caminhos dos arquivos que eles podem conter.

Com -type f , apenas arquivos regulares são reportados (não links simbólicos, fifos, dispositivos ...).

find -printf , g tipo de classificação, uniq -f opções e a capacidade de sort , uniq e cut de lidar com caracteres NUL são GNU específico.

    
por 05.02.2013 / 07:44

Tags