Talvez algo assim:
find . -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";if [ -n "$file" ]; then touch "$dir" -mr "$file"; fi; done
Explicação:
Para passar a data de modificação de um arquivo para outro, precisamos executar:
touch file1 -mr file2
Primeiro, precisamos encontrar subdiretórios:
find . -type d -print0 | while read -r -d '' dir; do echo "$dir"; done
Nesse caso, a opção -exec
ficaria muito complexa, por isso uso a abordagem de leitura por segundo. Você precisa certificar-se de enviar a saída de find
com NUL
como separador de registro e informar read
para dividir isso ( -d ''
).
Para encontrar arquivos com a data da última modificação, posso usar:
find ./ -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-
Combinando:
find . -mindepth 1 -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";echo "$dir <- $file"; done
Por fim, adicione o toque:
find . -mindepth 1 -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";touch "$dir" -mr "$file"; done
Eu uso a opção -mindepth
aqui porque eu iniciei este comando a partir do diretório contendo dir_a que não possui nenhum arquivo para ler a data. Para eliminar esse problema, posso usar if-else para garantir que não tente ler o tempo de um arquivo não existente:
find . -type d -print0 | while read -r -d '' dir; do file="$(find "$dir" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2-)";if [ -n "$file" ]; then touch "$dir" -mr "$file"; fi; done