![すべてのサブディレクトリ内のすべてのtarファイルのコード行数を合計します](https://rvso.com/image/168789/%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%B5%E3%83%96%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AEtar%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E8%A1%8C%E6%95%B0%E3%82%92%E5%90%88%E8%A8%88%E3%81%97%E3%81%BE%E3%81%99.png)
すべてのサブディレクトリ内のすべての 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"
この例では、合計 18 行 (tar 1 に 7 行、tar 2 に 5 行、tar 3 に 1 行、tar 4 に 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
これら 2 つのコマンドを組み合わせるにはどうすればよいですか。または、この問題を解決する効率的な代替手段はありますか。
答え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 行になります。
アーカイブ内のファイルを一覧表示します。
$ 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
/オプションを使用してファイルを 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
(最後の行には
Line 2
改行がありません)次の行を数えます
wc
:$ find . -name "*.tar" -print0 | xargs -0I{} tar xOf {} | wc -l 10