obtém o timestamp dos arquivos apresentados pelo loop FOR

3

Meu objetivo é encontrar $ arquivos em alguns dispositivos $ e salvá-los em uma ou mais pastas que são namend correspondentes a um timestamp de cada arquivo. Para obter o timestamp que eu queria usar stat.

Em contraste com o echo "$ files", o stat não processa cada arquivo separadamente. Em vez disso, parece processar todos os arquivos de uma só vez quando eu uso "".

Você tem alguma sugestão sobre como melhorar citações ou quaisquer outras dicas sobre como tornar estatístico o que eu quero fazer? Muito obrigado pela sua ajuda.

#!/bin/bash
for devices in "$(ls /media/*/)";
  do
    for files in "$(find /media/*/$devices -iname *.jpg)";
      do
        echo "$files"   # prints all files in separate lines
        stat "$files"   # seems to process all files at once
        stat $files     # splits file paths at spaces
      done
  done
    
por ha2k 21.03.2015 / 10:03

2 respostas

2

O problema não é com stat , mas com os dados de origem em seu for loop; porque você incluiu tudo entre aspas, torna-se uma única entidade longa.

Para corrigir isso, remova as aspas ao redor:

for files in $(find /media/*/$devices -iname "*.jpg");

Funciona desde que nenhum dos arquivos ou caminhos possuam espaços. Mas há uma solução mais elegante que funciona com espaços e até mesmo com nomes de arquivos estranhos (por exemplo, aqueles que incluem citações ou novas linhas):

while IFS= read -r -d '' file; do
    # operations on each "$file" here
done < <(find /media/*/$devices -type f -iname *.jpg -print0)
    
por 21.03.2015 / 10:25
1

Não analise a saída de ls . Você não pode distinguir uma nova linha introduzida por ls de uma nova linha em um nome de arquivo. O mesmo vale para find .

for devices in $(ls /media/*/) é apenas uma maneira complexa e quebrada de escrever for devices in /media/*/* . Em vez de for files in $(find …); do …; done , use find … -exec … .

Você não precisa dos dois loops aqui, pois você só está enumerando arquivos para usar o conjunto completo mais tarde. Seu roteiro é simplesmente

find /media/*/* -iname '*.jpg' -exec stat {} +

Para mais informações, consulte Por que meu script de shell sufoca em espaços em branco ou outros caracteres especiais?

    
por 21.03.2015 / 22:17

Tags