Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/06/2019, à 16:28

L'Africain

(Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Bonjour,
J'essaye de fusionner des fichiers dans des sous-dossiers avec cat, mon premier problème c'est qu'il les fusionne pas dans l'ordre, il commence par le fichier numéro 10 puis 11,etc. Il devrait commencer par le fichier 1.txt 2.txt,etc.
Ça c'est le premier point, les fichiers s'appellent par leur chiffre (1.txt, 2.txt...)
Le second problème, c'est qu'il faudrait fusionner tous les fichiers qui se trouver dans un  sous-dossier dans ce même sous-dossier et non tous les fichiers des sous-dossiers dans un unique fichier, ce que j'obtenais quand j'utilisais find.
Merci d'avance.

Dernière modification par L'Africain (Le 08/06/2019, à 19:33)


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#2 Le 08/06/2019, à 17:33

inbox

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Salut,

Je n'ai pas de réponse pour Cat.

J'ai vérifié et la section Concaténation indique comment faire avec Pdftk.

A+


Un problème résolu ? Indiquez le en modifiant le titre du sujet.

Hors ligne

#3 Le 08/06/2019, à 18:45

kamaris

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Peut-être y a-t-il plus simple et/ou mieux à divers égards, mais voici ce que je te propose, qui me semble faire le boulot :

find . -type d -exec bash -c 'cd "{}" ; find . -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | sort -n | xargs cat > catfile.txt' \;

Sachant que cette commande est à lancer depuis l'endroit où se trouvent tes sous-répertoires contenant potentiellement des fichiers *.txt. Sinon, il faut remplacer le « . » du premier find par autre chose.

Dernière modification par kamaris (Le 08/06/2019, à 19:31)

En ligne

#4 Le 08/06/2019, à 19:32

L'Africain

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Ça fonctionne très bien un grand merci! Comment tu as fait pour que la concatenation respecte les numéros?


Ubuntu-Unity 18.04 LDLC (clevo) X/Lubuntu-Mate
"Donne à celui qui te demande…" Mt 5,42

Hors ligne

#5 Le 08/06/2019, à 19:44

kamaris

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

C'est le sort -n appliqué à une liste de noms numériques sans préfixe, grâce au printf "%f\n" (1.txt, 2.txt, etc., et non pas ./1.txt, ./2.txt, etc.).

Par contre il reste un petit souci je pense : dans les répertoires où il n'y a pas de fichiers *.txt, cette commande va te créer un fichier vide « catfile.txt ». Pour remédier à ça, il est possible de rajouter un petit test à la fin :

find . -type d -exec bash -c 'cd "{}" ; find . -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | sort -n | xargs cat > catfile.txt ; test -s catfile.txt || rm catfile.txt' \;

Dernière modification par kamaris (Le 08/06/2019, à 19:45)

En ligne

#6 Le 08/06/2019, à 20:37

Watael

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

cf. man find /-execdir

$ for d in ./*/; do for f in "$d"[0-9]*.txt; do filename="${f##*/}"; ar[${filename%.*}]="$f"; done; cat "${ar[@]}" >"${d}concatFile"; ar=(); done

ce n'est pas testé.

s'il faut descendre plus profondément, il est possible de positionner l'option shell globstar


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#7 Le 08/06/2019, à 21:25

kamaris

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Watael a écrit :

cf. man find /-execdir

Je ne vois pas ce qu'apporte -execdir en l'occurrence. Ou faut-il l'employer dès qu'on le peut à la place d'-exec ?

Dernière modification par kamaris (Le 08/06/2019, à 21:26)

En ligne

#8 Le 08/06/2019, à 22:07

Watael

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

ça évite le cd.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 08/06/2019, à 22:54

kamaris

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Eh bien non je ne crois pas, car ça va lancer l'exécution dans le sous-répertoire où se trouve le répertoire trouvé par le premier find, pas dans ce répertoire lui-même.

En ligne

#10 Le 09/06/2019, à 00:25

Watael

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

c'est ce que veux L'Africain, et c'est ce que fait cd : le répertoire trouvé devient le répertoire courant,
et c'est ce que fait -execdir :

$ find /tmp -type f -name 1.txt -exec bash -c 'echo $PWD' \;
/home/watael
$ find /tmp -type f -name 1.txt -execdir bash -c 'echo $PWD' \;
/tmp

et, tant qu'à faire, il est préférable de prendre l'habitude, quand il y a d'autres commandes qui traitent les noms de fichiers, de les faire suivre (les noms de fichiers) d'un caractère NULL (\0), car les noms de fichiers peuvent contenir des alinéas


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#11 Le 09/06/2019, à 00:57

kamaris

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

Oui, mais dans mon cas je ne recherche pas des fichiers avec le premier find, mais des répertoires, si bien que :

$ find /tmp -type d -name d1 -exec bash -c 'cd "{}" ; echo $PWD' \;
/tmp/d1
$ find /tmp -type d -name d1 -execdir bash -c 'echo $PWD' \;
/tmp

Par ailleurs, je ne vois pas comment me passer de ce double find : un pour trouver les répertoires, l'autre pour trouver les fichiers *.txt. Je ne peux pas rechercher directement les *.txt et rentrer dans leurs répertoires par un -execdir, car alors comment passerais-je le résultat du find à un pipe ?

En ligne

#12 Le 09/06/2019, à 02:56

Watael

Re : (Résolu) Fusionner fichiers avec numérotation dans sous-dossiers

ah, d'accord. pas vu.
ce n'en est pas moins moche.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne