web-dev-qa-db-fra.com

Sed donne: sed: impossible de lire: aucun fichier ou répertoire de ce type

J'ai le script suivant bash qui se répète pour chaque image trouvée. Il doit itérer sur tout html , css et js , et remplace toutes les occurrences d’une image dans ce fichier.

 for image in app/www/images-theme-dark/*.png
    do
        echo "installing icon" $image

        # extract filename from iconpath
        iconfile=$(basename $image)
        iconPath="images/"$(basename $image)

        # replace paths in all files containing icon paths
        find app/www -type f \( -name "*.html" -or -name "*.css" -or -name "*.js" \
                            -or -name "*.appcache" \)  \
            -exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \;

    done

Cependant, lorsque je lance le script, sed donne:

sed: can't read : No such file or directory

Sur StackOverflow j'ai trouvé sed: ne peut pas lire: aucun fichier ou répertoire de ce type Mais j'avais déjà des guillemets autour de {}

Lorsque j'exécute la commande sed et que je l'exécute manuellement sur la ligne de commande, il n'y a pas d'erreur.

J'utilise GNU sed v4.2.2 sur Raspbian GNU/Linux 8.0 (jessie)

Est-ce que quelqu'un voit ce qui pourrait être faux ici?

22
Bas van Dijk

( Compiler une réponse à partir de commentaires, le savoir-faire est de melpomene et AlexP. )

Qu'est-ce que c'est '' après sed -i?

-i signifie "en place", c’est-à-dire, éditer directement dans le fichier.
-i '' signifie éditer sur place un fichier dont le nom est la chaîne vide.
Puisqu'il n'y a probablement aucun fichier dont le nom est la chaîne vide, sed se plaint de ne pouvoir pas le lire.

Note 1 dépendance de la plate-forme:
La syntaxe de -i est une différence entre GNU sed et sed de mac os.

Note 2 ordre "habituel" des arguments:
Le -e _ pour indiquer que le code sed permet de l’intercaler entre les noms de fichiers.
Ceci est un piège (dans lequel j'ai par exemple été pris de manière embarrassante), en vous faisant passer en revue vos attentes par rapport à ce que vous trouvez où dans une ligne de commande sed.
Il permet
sed -i filename -e "expression" AnotherFileName
qui est une version camouflée par inadvertance de
sed -i'NoExtensionGiven' "expression" filename AnotherFileName.

38
Yunnosch

Pour la prise en charge sous OSX et Linux, j’utilise un simple test if pour savoir si le script bash s’exécute sous OSX ou Linux, et ajuste la commande -i argument basé sur cela.

if [[ "$OSTYPE" == "darwin"* ]]; then
  sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
else
  sed -i -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
fi
1
Acidic