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
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
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
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
Uma possível solução com ferramentas GNU:
find dirA dirB -type f -printf '%T@/%pfind 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.
Tags bash