Как написать сценарий bash, который будет рекурсивно подсчитывать количество слов в каждом документе? - PullRequest
0 голосов
/ 26 февраля 2020

Мне нужно написать скрипт bash, который будет рекурсивно находить все файлы в каталоге , заданном в качестве аргумента , и подсчитывает количество слов в каждом документе.

Код, который я пробовал до сих пор, найден ниже, но он не работает:

#!/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."

Я использую терминал Ubuntu , чтобы выполнить скрипт с помощью следующей команды строка: sudo bash myscript. sh / home / myuser / Documents /

Другие адреса папок, которые я пробовал включать:

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

и т. д ...

Где "/ home / myuser / Documents /" - это полный адрес каталога, заданного в качестве аргумента, а также папки my bash script " myscript. sh".

Вывод моего скрипта следующий:


"Сценарий инициализирован.

Полный адрес базового каталога: / home / myuser / Documents /

Текстовый файл Для анализа необходимо выполнить следующие действия:

. / README.txt

. / TestFiles / test.txt

. / TestFiles / names.txt

Имя файла: / home / myuser / Documents /

Количество слов в этом файле: w c

Сценарий полностью выполнен. "


Я могу не найти что не так. Может быть, это адрес каталога, который я даю в качестве параметра, или, может быть, это логика c моего скрипта. Я довольно потерян здесь, и любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Почему бы не просто найти и w c -w для подсчета слов?

find . -type f -exec wc -w {} \; | sort -n
0 голосов
/ 26 февраля 2020

Попробуйте это в разделе для l oop.

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 голосов
/ 26 февраля 2020

Ваше назначение NumberOfWords не выполняется wc. Присвоение формы

a=(foo bar baz)

создает массив из 3 элементов a с элементами foo, bar и baz.

, поскольку вы уже используете find, Мне интересно, почему вы не просто делаете

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

Кстати, я бы также предоставил значение по умолчанию для базового каталога, то есть

BaseDirectory="${1:-.}"

, так что если пользователь делает если команда не указана, команда работает с текущим рабочим каталогом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...