Bash - obtém string contendo espaços em loop [duplicate]

0

Eu estou tentando escrever um script bash que opera em cada diretório em um subconjunto. Infelizmente, o caminho contém espaços e não consigo alterar o nome.

O loop for insiste em quebrar em cada espaço; Já experimentei dezenas de variantes, mas não consegui encontrar uma solução.

Uma versão simplificada está abaixo.

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in 'ls -d "$SOURCE"/201*'
do
    echo "File: $file"
done

Alguém pode sugerir como posso obter todas as entradas? /Volumes/Time Machine Backups/Backups.backupdb/Zaphod/2017-06-30-215735 em uma variável separada.

    
por Milliways 06.07.2017 / 04:55

2 respostas

0

Se não houver espaços nos arquivos no diretório:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
for file in $(ls -d ./201*)
do
    echo "File: $file"
done

se não tiver certeza de que os espaços estão na lista de diretórios ou não, faça isso:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
shopt -s nullglob
for filename in 201*;do
   if [[ ! -d "$filename" ]];then
      echo "$filename"
   fi
done
shopt -u nullglob

Não estou claro se você deseja ou não nomes de arquivos de diretório. Se não, é isso que funciona.

A segunda é a solução geralmente preferida quando você não sabe se há espaços ou não.

    
por 06.07.2017 / 05:05
2

A solução menos alterada é:

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in "$SOURCE"/201*
do
    echo "File: $file"
done

Uma alternativa (se você não tiver problemas em alterar os parâmetros posicionais):

#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
set -- "$SOURCE"/201*
for file; do
    echo "File: $file"
done

Uma solução mais precisa que evita diretórios e trabalha em arquivos com espaços (mas não em novas linhas):

ls -dp "$a"/201* | grep -v '/$' | 
    while read f; do echo "File:$f"; done

Ou uma solução que funciona para qualquer nome, mas que também pode listar arquivos de pontos (se o nome corresponder):

find "$a" -type f -name "201*" -exec echo "File: {}" \;
    
por 06.07.2017 / 05:34