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:
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.
3 Réponses :
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 {} \;
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
Pourquoi pas un simple find et wc -w pour compter les mots?
find . -type f -exec wc -w {} \; | sort -n
Vous pouvez envisager d'utiliser à la place -execdir wc -w '{}' +
, mais +1 pour la solution de recherche et le tri numérique.
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 bouclefor
ne rentrera pas dans les sous-répertoires, mais en utilisantpendant 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'unecho -e ..
au lieu de trois:) code >
Changer
(wc -w dossier) code> dans
$ (wc -w $ dossier) code> pour empêcher le message incorrect "Nombre de mots dans ce fichier: WC".