Caminho de arquivo do Windows convertido em caminho de arquivo do Linux

9

Eu tenho um caminho do Windows em uma variável bash como uma string:

file='C:\Users\abcd\Downloads\testingFile.log'

Estou tentando converter esse caminho em um caminho do Linux começando com /c/Users... .

Minha tentativa

Os seguintes trabalhos:

file=${file/C://c}
file=${file//\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log

Problema

Aqui, fiz isso para uma string que contém o caminho de arquivo. A razão pela qual estou fazendo esta pergunta é que eu tenho que converter 20 dessas strings em um script bash no Ubuntu 16.04 e cada vez que faço isso eu tenho que escrever 2 linhas por conversão - está ocupando muito espaço!

Pergunta

Existe uma maneira de combinar os 2 comandos

file=${file/C://c}
file=${file//\//}

em um comando?

    
por W R 05.04.2017 / 00:57

4 respostas

15

Haveria uma maneira de fazer as duas substituições de uma vez usando sed , mas não é necessário.

Veja como eu resolveria esse problema:

  1. Colocar nomes de arquivos na matriz
  2. Iterar pelo array

filenames=(
  'C:\Users\abcd\Downloads\testingFile.log'
  # ... add more here ...
)

for f in "${filenames[@]}"; do
  f="${f/C://c}"
  f="${f//\//}"
  echo "$f"
done

Se você quiser colocar a saída em uma matriz em vez de imprimir, substitua a linha echo por uma atribuição:

  filenames_out+=( "$f" )
    
por wjandrea 05.04.2017 / 02:03
8

Se é algo que você quer fazer muitas vezes, por que não criar uma pequena função de shell?

win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\//}"; }

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$ 
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar
    
por steeldriver 05.04.2017 / 02:06
2

Você conseguiria isso em uma linha usando sed

file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\|/|g')"

Observe que os dois padrões devem permanecer separados, no entanto, conforme as correspondências são substituídas por substituições diferentes.

    
por taifwa 05.04.2017 / 01:29
1

Esta questão ainda está aberta a novas sugestões? Se sim, isso ajudaria você?

$ file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '\' '/')"
$ echo $file
/C:/Users/abcd/Downloads/testingFile.log

Ah, e no caso de o C deve ser convertido para minúsculas:

file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '^C' 'c'|tr '\' '/')"

Como uma visão geral:

$ file='C:\Users\abcd\Downloads\testingFile.log'
$ echo $file
C:\Users\abcd\Downloads\testingFile.log
$ file="/$(echo $file|tr '^C' 'c'|tr '\' '/')"
$ echo $file
/c:/Users/abcd/Downloads/testingFile.log
    
por WillemK 27.04.2017 / 19:29