Este é um script que estou escrevendo para o exercício. Ele deve encontrar recursivamente todos os arquivos regulares na subárvore do diretório atual e alterar a data da última modificação para a data de ontem.
#!/bin/bash
YESTERDAY=$(date -d yesterday)
RFILES=$(ls -lR | egrep '^-' | rev | cut -d" " -f1 | rev)
for i in $RFILES ; do
ABSPATH=$(readlink -f $i)
touch "$ABSPATH" -d "$YESTERDAY"
done
Se eu chamá-lo em um diretório com uma subárvore como a seguinte:
a
|___ b
| |__ file1
| |__ file2
|
|__ file3
|__ file4
readlink
não funciona como esperado. O que quero dizer é que ele me diz isso file1
e file2
está dentro do diretório a
. Então, quando eu uso touch
para alterar a data da última modificação deles, ele cria mais dois file1
e file2
no a
diretório com a data de ontem.
Em primeiro lugar, o comando
ls -lR | egrep '^-' | rev | cut -d" " -f1 | rev
apenas mostra nomes de arquivos sem caminhos. Se você precisar obter todos os arquivos com caminhos, poderá usarfind ./ -type f
e analisar essa saída. Portantoreadlink -f $i
, o comando não será necessário.Em segundo lugar, se você precisar de uma solução mais eficaz, precisará apenas
find
do comando com oexec
parâmetro:O programa readlink é para ler a localização de links simbólicos, se você tiver apenas arquivos regulares, pode haver ferramentas melhores para o trabalho. Para encontrar arquivos, gosto de usar o
find
comando. Parece que você pode fazer todo o exercício em uma etapa usando find:find .
: pesquise o diretório atual.
e tudo abaixo-type f
: pesquisa apenas por arquivos regulares-exec
: diga ao find para executar o seguinte comando para cada objeto que encontrartouch {} -d "$(date -d yesterday)" \;
: o comando que você deseja executar em cada arquivo. O "{}" é o espaço reservado para a saída defind
e o \; designa o fim da-exec
declaraçãoSeus RFILES são apenas nomes de arquivos sem caminhos.
readlink
não éfind
, ele usa os nomes que você fornece e, sem um caminho neles, presume-se que eles estejam no diretório atual.Com bash moderno:
Mas você não precisa
readlink
, pode usar a saídals
diretamente. Comglobstar
ele é tão simples quanto:e na prática nem precisa
ls
:Caso contrário com
find
:Finalmente, a especificação de data
touch
é mais flexível do que você pensa:vai funcionar...