Comment répertorier de manière récursive le contenu de tous les fichiers d'un référentiel (extension-agnostic) dans un seul fichier texte?

1

Je sais que l'utilisation de "ls -R." en bash, vous pouvez lister récursivement les noms de fichiers.

Puis-je utiliser une commande similaire pour répertorier le contenu de chaque fichier exactement comme leurs noms sont affichés à l'aide de la commande ls. Je veux dire à un seul fichier ou flux comme la sortie standard.

Est-il possible de formater la sortie d'une telle commande? Comme par exemple, ajouter quelque chose comme quelques lignes vierges entre le contenu de chacun des fichiers pour une meilleure lisibilité?

Arpith
la source

Réponses:

0
find . -type f | while read file;
do
  # Here you can do whatever you like
  # Like output a few empty lines
  echo
  echo

  # output filename
  echo $file      
  # this prints the contents of the file to STD OUT
  cat $file;

done > targetfile
Fusil
la source
Mais comment obtenez-vous tout dans un seul fichier? Quand j'essayais cela, il se mettait dans une boucle sans fin, catcontenant à nouveau les mêmes fichiers.
Slhck
@slhck - en boucle? Je ne vois pas comment
Nifle
Comment puis-je utiliser ceci: -type f -exec cat {} \; le mettre dans un seul fichier?
Arpith
@Arpith -find . -type f -exec cat {} \; > /path/to/your/outputfile
Nifle
@Nifle: Je pense que la commande répertorie le contenu du même fichier de manière récursive plutôt que d'aller en profondeur dans la hiérarchie du système de fichiers et de répertorier le contenu de divers fichiers.
Arpith
0

Créez un méta-script avec find et dirigez-le vers sh.

$ find /home/jaroslav/tmp/su/  2>/dev/null \
    -printf 'echo -e \\\\n\\\\n%p\ncat "%p"\n' |sh

en dehors:

/home/jaroslav/tmp/su/
cat: /home/jaroslav/tmp/su/: Is a directory


/home/jaroslav/tmp/su/diff.tar.gz
J▒▒P▒▒M
6M)FR▒▒▒▒▒▒F2▒/9e▒▒s]▒Nh▒▒ޫzr▒▒hD▒▒Z&▒▒X▒▒|*▒o▒▒z▒▒▒▒|x߁▒▒E▒▒▒4▒▒Kऺ▒▒J▒-▒B▒▒▒Z▒▒▒?▒▒▒▒▒
        ▒▒P▒▒鿶▒▒JFj▒=Z▒?%▒▒▒▒▒▒▒▒▒▒▒{▒▒▒M▒▒▒▒$▒▒q(

/home/jaroslav/tmp/su/while
while read line; do
    login=$(echo $line | cut -d : -f 1)
        echo $login
done < /etc/passwd
Рослав Рахматуллин
la source