Суммируйте общее количество строк кода во всех tar-файлах во всех подкаталогах.

Суммируйте общее количество строк кода во всех tar-файлах во всех подкаталогах.

Я хотел бы подсчитать сумму общего количества строк всех tar-файлов во всех подкаталогах.

Рассмотрим следующий пример каталога se-example:

se-example
├── directory1
│   ├── archive1.tar
│   └── archive2.tar
└── directory2
    ├── README.txt
    ├── archive3.tar
    └── directory3
        └── archive4.tar

Чтобы воссоздать этот пример, учтите следующее:

echo "create and enter example"
mkdir se-example
cd se-example

echo "create example directory 1 (w/ two tar files)"
mkdir directory1
cd directory1

echo "create example tar 1 [+7 lines]"
mkdir archive1
printf "Line 1 \n Line 2" >> archive1/README.txt
printf "Line 1 \n Line 2" >> archive1/code1.py
printf "Line 1 \n Line 2 \n Line 3" >> archive1/code2.py
tar -cf archive1.tar archive1
rm -rf archive1 

echo "create example tar 2 [+5 lines]"
mkdir archive2 
printf "Line 1 \n Line 2 \n Line 3" >> archive2/code1.py
printf "Line 1 \n Line 2" >> archive2/code2.py
tar -cf archive2.tar archive2
rm -rf archive2

cd ..

echo "create example directory 1 (w/ subdirectory, readme, and two tar files)"
mkdir directory2
cd directory2

echo "create example readme [+0 lines]"
printf "Line 1 \n Line 2" >> README.txt

echo "create example tar 3 [+1 line]"
mkdir archive3 
printf "Line 1" >> archive3/code1.py
tar -cf archive3.tar archive3
rm -rf archive3

echo "create example subdirectory (w/ one tar file)"
mkdir directory3
cd directory3

echo "create example tar 4 [+5 lines]"
mkdir archive4
printf "Line 1 \n Line 2 \n Line 3" >> archive4/code1.py
printf "Line 1 \n Line 2" >> archive4/code2.py
tar -cf archive4.tar archive4
rm -rf archive4

cd ..
cd ..
cd ..

echo "done creating example"

В этом примере есть четыре файла tar с общим количеством строк 18 (7 строк в tar 1, 5 строк в tar 2, 1 строка в tar 3 и 5 строк в tar 4). Правильный ответ — 18.

Я знаю, как посчитать количество tar-файлов (предложено здесь):

find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
  printf "%-25.25s : " "$dir"
  find "$dir" -name "*.tar" | wc -l
done

Я знаю, как подсчитать количество строк кода в отдельных tar-файлах (предложено здесь):

tar -tf se-example/directory1/archive1.tar | wc -l

Как объединить эти две команды или есть ли эффективная альтернатива, которая решит эту проблему?

решение1

Вы пропустили новую строку \nв последней строке каждого из ваших тестовых файлов, поэтому количество wcна самом деле меньше:

$ find . \( -name "*.py" -o -name "README*" \) -print0 | xargs -0 wc -l
  1 ./directory1/archive1/README.txt
  1 ./directory1/archive1/code1.py
  2 ./directory1/archive1/code2.py
  2 ./directory1/archive2/code1.py
  1 ./directory1/archive2/code2.py
  1 ./directory2/README.txt
  0 ./directory2/archive3/code1.py
  2 ./directory2/directory3/archive4/code1.py
  1 ./directory2/directory3/archive4/code2.py
 11 total

Поскольку /directory2/README.txtв архиве его нет, то всего у нас 10 строк.

  1. Список файлов в архивах:

    $ find . -name "*.tar" -print0 | xargs -0I{} tar tf {}
    archive1/
    archive1/README.txt
    archive1/code1.py
    archive1/code2.py
    archive2/
    archive2/code1.py
    archive2/code2.py
    archive3/
    archive3/code1.py
    archive4/
    archive4/code1.py
    archive4/code2.py
    
  2. Извлеките файлы в stdout с помощью параметра -O/ --to-stdout:

    $ find . -name "*.tar" -print0 | xargs -0I{} tar xOf {}
    Line 1
     Line 2Line 1
     Line 2Line 1
     Line 2
     Line 3Line 1
     Line 2
     Line 3Line 1
     Line 2Line 1Line 1
     Line 2
     Line 3Line 1
     Line 2
    

    (В последней строке Line 2нет перевода строки)

  3. Подсчитайте строки с помощью wc:

    $ find . -name "*.tar" -print0 | xargs -0I{} tar xOf {} | wc -l
    10
    

Связанный контент