![Sume el número total de líneas de código en todos los archivos tar en todos los subdirectorios](https://rvso.com/image/168789/Sume%20el%20n%C3%BAmero%20total%20de%20l%C3%ADneas%20de%20c%C3%B3digo%20en%20todos%20los%20archivos%20tar%20en%20todos%20los%20subdirectorios.png)
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 \n
para la última línea en cada uno de tus archivos de prueba, por lo que el recuento wc
es 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.txt
no está en un archivo, tenemos 10 líneas en total.
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
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 2
no tiene nueva línea)Cuente las líneas con
wc
:$ find . -name "*.tar" -print0 | xargs -0I{} tar xOf {} | wc -l 10