Como listar arquivos que contêm espaço em branco no nome do arquivo? [duplicado]

2

Eu estou tentando ler arquivos um por um usando o loop for como abaixo, passando argumentos para as funções. O argumento 3 causa muito problema devido ao espaço nos nomes dos arquivos.

Exemplo:

source_file_restructure()
{

echo "inside the function"
source_folder=$1
target_folder=$2
file_pattern=$3
delimiter=$4


echo $file_pattern


echo " Getting inside the function.... "


for file_name in 'ls -Al ${source_folder}*"${file_pattern}"*.csv'
do

some processing.......

done

O comando ls acima não está funcionando corretamente quando há arquivos contendo espaços em branco como o arquivo 1.csv,

Entrada:

SOurce Folder : /home/test/

File Pattern : "file"

Function argument : 
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}

Sugira alguma opção para lidar com o problema.

    
por William R 19.10.2014 / 18:20

3 respostas

3

Substituir

for file_name in 'ls -Al ${source_folder}*"${file_pattern}"*.csv'

Com:

for file_name in "${source_folder}"*"${file_pattern}"*.csv

A saída de um comando nos backticks, como no primeiro formulário acima, está sujeita à divisão de palavras. O segundo formulário acima não usa backticks. Por outro lado, ele funcionará com qualquer nome de arquivo, mesmo aqueles que contenham espaços, tabulações, novas linhas ou qualquer outro caractere difícil.

Além disso, substitua

source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}

com

source_file_restructure "${source_folder}" "${target_folder}" "${file_pattern}" "${delimiter}"

Sem as aspas duplas, o shell executará a divisão de palavras. Com as aspas duplas, a função será chamada corretamente mesmo se source_folder ou target_folder tiverem espaços, tabulações, novas linhas ou outros caracteres difíceis.

    
por 19.10.2014 / 19:04
0

Você precisa definir a seguinte variável de ambiente no primeiro do seu script:

IFS=$(echo -en "\n\b")
    
por 19.10.2014 / 18:33
0

Eu usei algo assim em um dos meus scripts:

ls -Q "$folderToRead" | while read file # ls -Q puts every entry between quotes : "file".
do
    file='echo $file | tr -d '"'' # This erases the quotes from the -Q argument, so you 
                                    # can work on the file without worrying about it.

Claro, você teria que fazer isso funcionar no seu script, editando o comando ls. Acabei de escrever a versão curta.

    
por 19.10.2014 / 20:56

Tags