readlink -f não funciona como esperado

0

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 última data de 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 esta:

a  
|___ b  
|    |__ file1  
|    |__ file2
|    
|__ file3  
|__ file4  

readlink não funciona como esperado. O que quero dizer é que isso me diz que file1 e file2 estão dentro do diretório a . Então, quando eu uso touch para alterar a data da última modificação, ele cria mais dois file1 e file2 no diretório a com a data de ontem.

    
por ikeDiM 07.04.2018 / 20:50

3 respostas

2

Em primeiro lugar, o comando ls -lR | egrep '^-' | rev | cut -d" " -f1 | rev mostra apenas nomes de arquivos sem caminhos. Se você precisar obter todos os arquivos com caminhos, poderá usar find ./ -type f e analisar essa saída. Portanto, o comando readlink -f $i não será necessário.

Em segundo lugar, se você precisar de uma solução mais eficiente, precisará apenas do comando find com o parâmetro exec :

find . -type f -exec touch -d "$YESTERDAY" {} +

-type f       find regular files
    
por 07.04.2018 / 21:13
2

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 comando find . Parece que você pode fazer todo o seu exercício em uma etapa usando o find:

find . -type f -exec touch {} -d "$(date -d yesterday)" \;
  • find . : procure o diretório atual . e tudo abaixo
  • -type f : pesquisa somente por arquivos regulares
  • -exec : diz ao find para executar o seguinte comando para cada objeto que encontrar
  • touch {} -d "$(date -d yesterday)" \; : o comando que você deseja executar em cada arquivo. O "{}" é o espaço reservado para a saída de find e o \; designa o final da instrução -exec
por 07.04.2018 / 21:18
0

Seus 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, supõe-se que estejam no diretório atual.

Com o moderno bash:

shopt -s globstar
RFILES=( ** )

Mas você não precisa de readlink para poder usar a saída de ls diretamente. Com globstar , é tão simples como:

touch -d "$YESTERDAY" $(ls -d **)

e, na prática, você nem precisa do ls :

touch -d "$YESTERDAY" **

Caso contrário, com find :

find . -type f -exec touch -d "$YESTERDAY" {} +

Finalmente, a especificação de data para touch é mais flexível do que você pensa:

touch -d yesterday **

funcionará ...

    
por 07.04.2018 / 21:24