web-dev-qa-db-fra.com

Chemin de fichier Windows converti en chemin de fichier Linux

J'ai un chemin Windows dans une variable bash sous forme de chaîne:

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

J'essaie de convertir ce chemin en un chemin Linux commençant par /c/Users....

ma tentative

Les oeuvres suivantes:

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

Problème

Ici, je l’ai fait pour une chaîne contenant le chemin du fichier. La raison pour laquelle je pose cette question est que je dois convertir 20 chaînes de ce type dans un script bash dans Ubuntu 16.04 et chaque fois que je fais cela, je dois écrire 2 lignes par conversion - cela prend beaucoup de place!

Question

Est-il possible de combiner les 2 commandes

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

en une seule commande?

12
edesz

Il serait possible de faire les deux remplacements en même temps en utilisant sedname__, mais ce n'est pas nécessaire.

Voici comment je résoudrais ce problème:

  1. Mettre les noms de fichiers en tableau
  2. Itérer sur un tableau
filenames=(
  'C:\Users\abcd\Downloads\testingFile.log'
  # ... add more here ...
)

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

Si vous souhaitez placer la sortie dans un tableau au lieu d'une impression, remplacez la ligne echopar une affectation:

  filenames_out+=( "$f" )
17
wjandrea

Si c'est quelque chose que vous voulez faire plusieurs fois, pourquoi ne pas créer une petite fonction 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
9
steeldriver

Vous pourrez y arriver en une ligne en utilisant sed

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

Notez que les deux modèles doivent néanmoins rester séparés car les correspondances sont remplacées par des substitutions différentes.

2
taifwa

Cette question est-elle toujours ouverte à de nouvelles suggestions? Si oui, cela vous aiderait-il?

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

Oh, et si le C doit être converti en minuscule:

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

En guise d'aperçu:

$ 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
1
user680858