com zsh
:
cd that-dir &&
touch -r *(D.om[1]) .
Se você quiser considerar arquivos em subdiretórios também:
touch -r **/*(D.om[1]) .
E se você quiser fazer isso em todos os diretórios:
for d (**/*(D/)) touch -r $d/*(D.om[1]) -- $d
No meu diretório do media center, todos os horários modificados de minhas pastas não são, de alguma forma, a data desejada.
Como posso alterar todos os horários modificados das pastas principais para o horário modificado do mais novo arquivo de mídia dentro de cada pasta?
por exemplo:
cd /tmp
mkdir test
cd test
mkdir d1
mkdir d2
touch d1/text1.txt
touch d1/movie1.mov
touch d2/text2.txt
touch d2/movie2.mov
touch notthis.file
agora eu tentei:
ls -td *| head -n 1
mas isso dá:
notthis.file
com zsh
:
cd that-dir &&
touch -r *(D.om[1]) .
Se você quiser considerar arquivos em subdiretórios também:
touch -r **/*(D.om[1]) .
E se você quiser fazer isso em todos os diretórios:
for d (**/*(D/)) touch -r $d/*(D.om[1]) -- $d
Usando ls(1)
para pedir um diretório por hora de modificação, head(1)
para obter o primeiro dos arquivos e touch(1)
para alterar o horário de modificação do seu diretório de destino, é muito fácil.
Normalmente, não é aconselhável analisar a saída de ls
, já que raramente é necessário e fácil ser capturado em caracteres especiais, no entanto, neste caso, não consigo pensar em outra ferramenta que forneça o arquivo com facilidade o último registro de data e hora em um diretório.
touch_dir() {
dir="$1"
touch --reference="$(ls -td "${dir}"/* | head -n 1)" "${dir}"
}
Execute isso com um argumento que seja um diretório e defina o horário de modificação do diretório para a hora da última modificação de qualquer arquivo no diretório.
Ele falhará se não houver arquivos no diretório (fácil de testar de várias maneiras) ou se o nome de arquivo mais recente tiver uma nova linha incorporada - head
só obterá a peça antes da nova linha.
Para atualizar muitos diretórios, basta executá-lo em um loop.
Você pode definir o registro de data e hora de um diretório your_dir
como o de seu arquivo modificado mais recentemente com essa monstruosidade:
touch -t 'ls -ltr --time-style='+%Y%m%d%H%M.%S your_dir' | grep '^-' | tail -1 | awk '{print $6}'' your_dir
Não está claro o que você quer dizer com "pastas principais", então não incluímos nenhuma recursão.
Tags ext4 files filesystems ubuntu timestamps