Problemas de espaço em branco com script e variáveis

0

Estou tentando bater a cabeça contra a sintaxe disso. Estou tendo problemas com espaços em branco e não consigo ver se há uma maneira melhor de fazer isso.

vardir=/home/user
cd $vardir
for i in $(ls "$vardir") ; do
timestamp="$(stat -c %Y $i)"
echo "$i"
echo "$timestamp"

done

O resultado é semelhante, não importa onde eu cite e não tenho certeza do que estou fazendo de errado:

stat: cannot stat ‘Temporary’: No such file or directory
Temporary

stat: cannot stat ‘Items’: No such file or directory
Items

Meu objetivo é obter os carimbos de data e hora dos diretórios de backup e touch dos atuais para restaurar as datas originais modificadas.

    
por ezgoodnight 09.02.2015 / 23:12

2 respostas

6

Como outras pessoas disseram antes de mim: Não analise a saída de ls !

Por que não simplesmente:

stat --printf='%y\t%n\n' -- *

Se você quiser fazer algo com cada nome de arquivo e data e hora, read a saída de stat assim:

stat --printf='%y\t%n
for f in /source/dir/*; do
    touch -c -r "${f}" "/dest/dir/${f##*/}"
done
' -- * | \ while IFS=$'\t' read -rd '' timestamp i; do echo "filename: ${i}, timestamp: ${timestamp}" done

Não é preciso gerar um novo processo stat para cada arquivo, o que você notará assim que gerar algumas centenas de processos para algumas centenas de arquivos.

Para correspondências mais complicadas do que simples globbing, eu recomendo find com uma opção -printf adequada.

Edit: De acordo com os comentários para esta resposta, descobri que OP realmente quer copiar os carimbos de hora de modificação de arquivos de um diretório para outro. Isto é o que eu sugiro:

stat --printf='%y\t%n\n' -- *

Isso leva todas as entradas de /source/dir como referências de carimbo de hora ( -r ) para entradas do mesmo nome de arquivo em /dest/dir sem criar novos arquivos que não existem em /dest/dir yet ( -c ) .

    
por David Foerster 09.02.2015 / 23:47
4

Não analise a saída de ls , use um glob:

for i in * ; do

Além disso, cite as variáveis que podem conter espaços:

    timestamp=$(stat -c %y "$i")
    
por choroba 09.02.2015 / 23:20