모든 하위 디렉터리에 있는 모든 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
이 두 명령을 어떻게 결합할 수 있습니까? 아니면 이 문제를 해결할 수 있는 효율적인 대안이 있습니까?
답변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