Dividindo 'File' e 'directory name with space' via shell script

4

Eu tenho um arquivo chamado Files.txt com o seguinte conteúdo:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m

Eu estou puxando os nomes de arquivos e diretórios da seguinte forma e passando-os para outro processo.

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)

  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

No entanto, isso está me levando a isso:

TestApp/Resources/Supporting
TestApp/Resources

Files/main.m
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.h
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.m
Files

O que eu preciso é isto:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

Eu tentei prefixar o espaço com \ em Files.txt como:

TestApp/Resources/Supporting\ Files/main.m

e com %20 como:

TestApp/Resources/Supporting%20Files/main.m

sem sorte!

    
por Yas T. 28.03.2014 / 21:06

2 respostas

6
  1. for faz um loop iterar palavras não linhas
  2. sempre cite seu "$variables" (a menos que você saiba exatamente quando não)
while read -r item ; do    
  dn=$(dirname "$item")

  printf "%s\n" "$item"
  printf "%s\n" "$dn"

  # pass "$item" and "$dn" to another process
done < Files.txt
    
por 28.03.2014 / 21:10
1

Você precisa definir o separador de campo:

OIFS=$IFS  
IFS=$'\n'

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)
  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

IFS=$OIFS

Saída:

[me@localhost test]$ ./test.sh 
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

Explicação: link

A variável $IFS define como a entrada é dividida em tokens e o padrão é espaço, tabulação e nova linha. Como você deseja dividir apenas em novas linhas, a variável $IFS precisa ser temporariamente alterada.

    
por 28.03.2014 / 21:11