J'essaie de mettre tous les fichiers js dans un répertoire et des sous-répertoires dans un seul fichier dans l'ordre lexical. Qu'ai-je fait de mal?
J'essaie de mettre tous les fichiers js dans un répertoire et des sous-répertoires dans un seul fichier dans l'ordre lexical. Qu'ai-je fait de mal?
Réponses:
grep
C’est le mauvais outil pour cela, en partie parce qu’il n’émet des lignes que pour les fichiers qui correspondent au modèle que vous donnez (et probablement que vous voulez toutes les lignes), et en partie parce que vous n’avez pas donné de modèle, il utilise donc le premier nom de fichier le motif (ce qui n'est pas utile).
La liste de tous les *.js
fichiers est assez simple:
find . -name '*.js'
Et les concaténer dans un seul fichier est aussi facile:
find . -name '*.js' | xargs cat
Mais, les classer dans l'ordre lexical du nom de fichier, sans tenir compte du répertoire dans lequel ils se trouvent, est plus difficile.
Tout simplement sort
ne fera pas le travail, et il n'y a aucune --key
option qui sélectionnera le dernier champ lorsque le nombre de champs est inconnu.
Sed utilise les éléments suivants pour déplacer le nom de fichier au début de la ligne, le trie, puis le supprime à nouveau.
find . -name '*.js' | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2-
Cela ne fonctionnera pas correctement si l'un de vos noms de fichier ou de répertoire contient des espaces.
Vous pouvez ensuite extraire le contenu en ajoutant un cat
:
find . -name '*.js' \
| sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2- \
| xargs cat
cat $(find ./ -type f -name "*.js" | sort) > dirname/.filename
fonctionnerait pour vous?