Summieren Sie die Gesamtzahl der Codezeilen in allen TAR-Dateien in allen Unterverzeichnissen

Summieren Sie die Gesamtzahl der Codezeilen in allen TAR-Dateien in allen Unterverzeichnissen

Ich möchte die Summe der Gesamtzeilenanzahl aller Tar-Dateien in allen Unterverzeichnissen berechnen.

Betrachten Sie das folgende Beispielverzeichnis se-example:

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

Um dieses Beispiel nachzubilden, beachten Sie Folgendes:

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"

In diesem Beispiel gibt es vier Tar-Dateien mit insgesamt 18 Zeilen (7 Zeilen in Tar 1, 5 Zeilen in Tar 2, 1 Zeile in Tar 3 und 5 Zeilen in Tar 4). Die richtige Antwort wäre 18.

Ich weiß, wie man die Anzahl der Tar-Dateien zählt (hier vorgeschlagen):

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

Ich weiß, wie man die Anzahl der Codezeilen in einzelnen Tar-Dateien zählt (hier vorgeschlagen):

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

Wie kombiniere ich diese beiden Befehle oder gibt es eine effiziente Alternative, die dieses Problem löst?

Antwort1

\nIn jeder Ihrer Testdateien fehlt der Zeilenumbruch für die letzte Zeile, daher wcist die Anzahl tatsächlich geringer:

$ 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

Da /directory2/README.txtes sich nicht in einem Archiv befindet, haben wir insgesamt 10 Zeilen.

  1. Listen Sie die Dateien in den Archiven auf:

    $ 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. -OExtrahieren Sie die Dateien mit der Option / nach stdout --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
    

    (Die letzte Zeile Line 2hat keinen Zeilenumbruch)

  3. Zählen Sie die Zeilen mit wc:

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

verwandte Informationen