Lorsque je change des fichiers dans cygwin bash avec la commande sed, le fichier est verrouillé.
Reproduire:
- Ouvrir
cmd
etcd
dans un répertoire non utilisateur (fetemp
) echo aaa > test.txt
- Ouvrez dans texteditor, ajoutez une ligne, essayez d'enregistrer => travaux
%CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt
"- Dans texteditor, ajoutez une autre ligne et essayez d'enregistrer => "Accès refusé"
WTF?! Comment puis-je sed un fichier sans verrouillage, ou libérer les poignées de fichier par la suite?
Les autorisations de sécurité Windows semblent être complètement vissées sur le fichier:
Autorisations avant:
Autorisations après:
Cela fonctionne cependant dans le répertoire utilisateur (
Desktop
)- J'ai vérifié le fichier avec LockHunter mais aucun processus ne semble verrouiller le fichier
- La FAQ Cygwin mentionne les interférences avec certains programmes. Il a essayé de désinstaller Antivir et Catalyst et de redémarrer.
- Essayer
UnxTools(plante),GnuWin32(sed ne prend pas en charge la substitution sur place),Interex(l'installateur ne prend pas en charge W7 Pro) ... * soupir *
Réponses:
correspondant à Cygwin Mailinglist , utilisez noacl pour le montage
ou directement dans Windows
../cygwin/fstab
avant de démarrer Cygwin bashla source
J'ai eu exactement le même problème après avoir utilisé find en combinaison avec grep et sed sous cygwin pour traiter automatiquement un dossier plein de fichiers de code source Java. Sed a gâché les autorisations de fichiers NTFS de mes fichiers, qui étaient toujours persistantes après un redémarrage, j'ai donc cherché un moyen facile de résoudre ce problème.
En fait, j'ai trouvé un moyen facile de récupérer les autorisations de fichier sur les anciennes valeurs. Cela peut être fait pour un dossier entier récursivement, ce qui est important pour moi, car j'ai modifié tant de fichiers à la fois (plusieurs centaines). Malheureusement, je ne connais que les noms allemands des entrées de menu, donc je ne sais pas comment les entrées de menu (dans l'Explorateur Windows) sont appelées en anglais correct.
En allemand, vous faites: Faites un clic droit sur le dossier parent du dossier où j'ai utilisé sed, "Eigenschaften" (menu contextuel), "Sicherheit" (onglet dans la boîte de dialogue), "Erweitert" (bouton), "Berechtigungen ändern ... "(bouton avec invite UAC), maintenant je vérifie simplement les deux cases à cocher (celle du haut est déjà définie, mais celle du bas ne l'est pas, mais doit l'être). Maintenant, je clique sur "OK" trois fois.
La modification réelle qui en résulte est que la case à cocher inférieure oblige Windows à remplacer les autorisations actuelles pour le contenu du dossier de manière récursive par les autorisations du dossier que vous avez cliqué avec le bouton droit, afin que toutes les autorisations rompues soient corrigées. A fonctionné comme un charme pour moi, et est également très rapide (seulement quelques secondes pour beaucoup de fichiers).
Traductions possibles (devinées par moi):
la source
J'ai exécuté mon propre ensemble de tests et, en effet, les autorisations du fichier sont définies sur r-xr-x --- après que la commande sed et les commandes cygwin suivantes le percevront comme un fichier en lecture seule.
Ces autorisations -r-xr-x --- empêchent les écritures ultérieures par certains logiciels:
Donc, la solution de contournement serait d'ajouter un chmod supplémentaire sur le fichier
la source
chmod 777 test.txt
commande pour contourner ce problème.