0
votes

Comment écrire un script bash qui comptera récursivement le nombre de mots dans chaque document?

J'ai besoin d'écrire un script bash qui trouvera récursivement tous les fichiers dans un répertoire donné comme un argument et compte le nombre de mots dans chaque document.

Le code que j'ai essayé jusqu'à présent se trouve ci-dessous, mais il ne fonctionne pas:

#!/usr/bin/env bash

echo "Script initialized."

# Putting on a variable the address given as an argument:
BaseDirectory=${1}

echo ""
echo "Full address of the base directory: $BaseDirectory"
echo ""

# Finding (recursively) all the *.txt files from the directory this script is being executed:
echo "Text files to be analyzed are the following:"
find . -iname '*.txt' -exec echo "{}" \;
echo ""

for File in $BaseDirectory
do
        echo "File name: $File"
        NumberOfWords=(wc -w $File) #Counting the words present in the file
        echo "Number of words within this file: $NumberOfWords"
        echo ""
done

echo ""
echo "Script totally executed."
echo ""

read -p "Press [ENTER] to close this window."

J'utilise le terminal Ubuntu pour exécuter le script avec la ligne de commande suivante: sudo bash myscript.sh / home / myuser / Documents /

Les autres adresses de dossier que j'ai essayées incluent:

  • / home / myuser / Documents / *
  • /home/myuser/Documents/*.txt
  • / *

Et ainsi de suite ...

Où "/ home / myuser / Documents /" est l'adresse complète du répertoire donnée en argument et c'est aussi le dossier mon script bash " myscript.sh "est localisé.

La sortie de mon script est la suivante:


" Script initialisé.

Adresse complète du répertoire de base: / home / myuser / Documents /

Les fichiers texte à analyser sont les suivants:

./README.txt

./TestFiles/test.txt

./TestFiles/names.txt

Nom du fichier: / home / myuser / Documents /

Nombre de mots dans ce file: wc

Script totalement exécuté. "


Je ne trouve pas ce qui ne va pas. C'est peut-être l'adresse du répertoire que je donne comme paramètre ou peut-être la logique de mon script. Je suis assez perdu ici et toute aide est appréciée.


4 commentaires

Essayez de coller votre code dans shellcheck.net


trouver. -type f -iname '* .txt' est suffisant pour votre commande find (le -type f empêche le répertoire off nommé mydir.txt d'être inclus ). Votre boucle for ne rentrera pas dans les sous-répertoires, mais en utilisant pendant la lecture -r fname; do .. done <<(find. -type f -iname '* .txt') va.


De plus, vous n'avez besoin que d'un seul printf "\ nScript totalement exécuté. \ N \ n" ou d'un echo -e .. au lieu de trois :)


Changer (wc -w dossier) dans $ (wc -w $ dossier) pour empêcher le message incorrect "Nombre de mots dans ce fichier: WC".


3 Réponses :


0
votes

Votre affectation à NumberOfWords n'exécute pas wc . Une affectation de la forme

BaseDirectory="${1:-.}"

crée un tableau à 3 éléments a avec les éléments foo , bar et baz.

Puisque vous utilisez déjà find , je me demande pourquoi vous ne faites pas simplement un

find $BaseDirectory -iname '*.txt' -exec wc -w {} \;


0 commentaires

0
votes

Essayez ceci dans la section de la boucle for.

for File in "$BaseDirectory"/*.txt
do
        echo "File name: $File"
        NumberOfWords=$(wc -w < $File) #Counting the words present in the file
        echo "Number of words within this file: $NumberOfWords"
        echo ""
done


0 commentaires

2
votes

Pourquoi pas un simple find et wc -w pour compter les mots?

find . -type f -exec wc -w {} \; | sort -n


1 commentaires

Vous pouvez envisager d'utiliser à la place -execdir wc -w '{}' + , mais +1 pour la solution de recherche et le tri numérique.