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
\n
In jeder Ihrer Testdateien fehlt der Zeilenumbruch für die letzte Zeile, daher wc
ist 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.txt
es sich nicht in einem Archiv befindet, haben wir insgesamt 10 Zeilen.
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
-O
Extrahieren 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 2
hat keinen Zeilenumbruch)Zählen Sie die Zeilen mit
wc
:$ find . -name "*.tar" -print0 | xargs -0I{} tar xOf {} | wc -l 10