Sume el número total de líneas de código en todos los archivos tar en todos los subdirectorios

Sume el número total de líneas de código en todos los archivos tar en todos los subdirectorios

Me gustaría calcular la suma del número total de líneas de todos los archivos tar en todos los subdirectorios.

Considere el siguiente directorio de ejemplo se-example:

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

Para recrear este ejemplo, considere lo siguiente:

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"

En este ejemplo, hay cuatro archivos tar con un total de 18 líneas (7 líneas en tar 1, 5 líneas en tar 2, 1 línea en tar 3 y 5 líneas en tar 4). La respuesta correcta sería 18.

Sé cómo contar el número de archivos tar (sugerido aquí):

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

Sé cómo contar el número de líneas de código en archivos tar individuales (sugerido aquí):

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

¿Cómo combino estos dos comandos o existe una alternativa eficiente que resuelva este problema?

Respuesta1

Te falta la nueva línea \npara la última línea en cada uno de tus archivos de prueba, por lo que el recuento wces en realidad menor:

$ 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

Como /directory2/README.txtno está en un archivo, tenemos 10 líneas en total.

  1. Enumere los archivos en los archivos:

    $ 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. Extraiga los archivos a la salida estándar con la opción -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
    

    (La última línea Line 2no tiene nueva línea)

  3. Cuente las líneas con wc:

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

información relacionada