Pourquoi grep -r --include = *. Js *> dirname / .filename n’écrit-il pas tous les fichiers .js dans un seul fichier?

1

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?

utilisateur5448026
la source
2
Cela cat $(find ./ -type f -name "*.js" | sort) > dirname/.filenamefonctionnerait pour vous?
txtechhelp
@txtechhelp merci. c'est proche, mais les fichiers nommés 2.js et 3.js sont placés au-dessus d'un fichier /dirname/1.js. Si cela peut être corrigé, cela fonctionnerait très bien.
user5448026
Je peux simplement mettre un 1 devant le nom du répertoire mais il serait bon de ne pas avoir à le faire.
user5448026
Avez-vous besoin d'inclure le nom du répertoire dans votre liste? Ou avez-vous besoin d'avoir juste les noms de fichiers d'où qu'ils viennent?

Réponses:

0

grepC’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 *.jsfichiers 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 sortne fera pas le travail, et il n'y a aucune --keyoption 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
ams
la source