web-dev-qa-db-fra.com

convertir les fins de ligne dos2unix pour tous les fichiers d'un répertoire

Actuellement, j'utilise la commande suivante pour changer les fins de ligne de dos2unix, mais c'est pour fichier-y fichier..est-il possible d'exécuter cette commande pour tous les fichiers d'un répertoire

sed -i 's/\r//' filename to convert dos2unix line endings

Merci,

17
user1934146
for i in `find . -type f \( -name "*.c" -o -name "*.h" \)`; do    sed -i 's/\r//' $i ; done
4
Babasaheb Gosavi

La méthode la plus simple pour exécuter dos2unix sur un répertoire entier de manière récursive consiste simplement à l'exécuter pour la commande find pour chaque fichier trouvé en fonction de vos critères.

Par exemple, pour rechercher tous les fichiers (à l’exclusion des noms de répertoire) dans votre répertoire actuel et tous ses sous-répertoires et pour que dos2unix effectue la conversion par défaut sur chacun de ces fichiers:

find . -type f -exec dos2unix -k -s -o {} ';'

Cela produira chaque nom de fichier, mais ne changera pas nécessairement chacun d'entre eux. Cela fonctionne comme suit:

find .: Tout ce qui se trouve dans ce répertoire, y compris ses sous-répertoires, ainsi que tout ce qui se trouve dans ces sous-répertoires (récursivité)
-type f: Renvoie uniquement les noms de «fichiers normaux». Exclure les noms de dossiers des résultats.
-exec: Exécutez la commande suivante pour chaque résultat. Tout ce qui dépasse ce point doit être traité comme faisant partie de cette commande jusqu'à ce que le caractère ; soit trouvé.
dos2unix: dos2unix sera exécuté avec les options suivantes ...
-k: conserve l'horodatage du fichier de sortie identique à celui du fichier d'entrée
-s: Ignore les fichiers binaires (images, archives, etc.). Cette option est incluse par défaut, mais je l'utilise quand même au cas où les valeurs par défaut seraient différentes sur certains systèmes (par exemple, OS X v. Debian v. CentOS v. Ubuntu v. ...).
-o: écrivez les modifications directement dans le fichier, plutôt que de créer un nouveau fichier avec les données au nouveau format.
{}: Ceci indique à find d'insérer le nom de fichier trouvé en tant que paramètre de l'appel dos2unix.
';': Dites à find que les paramètres pour dos2unix ont pris fin. Tout ce qui est au-delà de ce point sera à nouveau traité comme un paramètre de find.

30
Bryson

Une autre option: find your_dir type f -exec sed -i 's/\r//' {} \;

Pourquoi n'utilisez-vous pas la commande dos2unix? Si vous faites juste le sed ci-dessus, il peut y avoir des fichiers (selon leur source) qui auront un EOF incorrect (vous pouvez le voir si vous exécutez cat et que l'invite est ensuite concaténée dans la sortie du fichier)

2
Eran Ben-Natan
dos2unix *.txt

fonctionne bien pour convertir tous les fichiers * .txt dans un répertoire ... pas besoin de la commande 'find'.

2
brent

Simple:

sed -i 's/\r//' filename1 filename2 … filenameN

ou, si vous parlez du contenu d'un répertoire

sed -i 's/\r//' *

Travaille juste bien pour moi.

2
Hubbitus

Je viens d'ajouter une autre référence ...

Sur Ubuntu 14.04, la page man dos2unix fournit cet exemple, en particulier pour la conversion récusive:

find . -name *.txt | xargs dos2unix

Citant la page de manuel, cela va 

... convertir tous les fichiers .txt de l’arborescence sous le .__ actuel. répertoire ...

1
Adrian Torrie

utilisation 

for i in `ls directory_path`; do    sed -i 's/\r//' $i ; done

pour tout le répertoire. 

0
Babasaheb Gosavi
find $(pwd) -type f | xargs -I xxx sed -i 's/\r//g' xxx
0
Jason