TAR에서 폴더를 반복하고 파일 수를 계산합니다.

TAR에서 폴더를 반복하고 파일 수를 계산합니다.

폴더를 순환하고 TAR에서 동일한 이름을 가진 파일 수를 계산해야 합니다.

나는 이것을 시도했습니다 :

find -name example.tar -exec tar -tf {} + | wc -l

하지만 실패합니다.

tar: ./rajce/rajce/example.tar: Not found in archive
tar: Exiting with failure status due to previous errors
0

example.tar가 하나만 있을 때 작동합니다.

각 파일에 개별적으로 번호를 매겨야 합니다.

감사해요!

답변1

tar -tf {} \;대신 각 타르볼을 개별적으로 tar -tf {} +실행 해야 합니다 tar. GNU에서는 다음과 man find같이 말합니다.

   -exec command {} +

          This variant of the -exec action runs the specified
          command on the selected files, but the command line is
          built by appending each selected file name at the end;
          the total number of invocations of the command will be
          much less than the number of matched files.  The command
          line is built in much the same way that xargs builds its
          command lines.  Only one instance of `{}' is allowed
          within the com- mand.  The command is executed in the
          starting directory.

귀하의 명령은 동일합니다 tar tf example.tar example.tar. 또한 인수가 누락되었습니다. 예를 들어 BSD find [path...]의 일부 구현은 오류를 find반환합니다 . find: illegal option -- n요약하면 다음과 같아야 합니다.

find . -name example.tar -exec tar -tf {} \; | wc -l

이 경우 wc -l파일 개수는 발견된 모든 파일 중에서 계산됩니다 example.tar. 현재 디렉터리에 있는 파일 만 -maxdepth 1검색 할 수 있습니다. 모든 것을 재귀적으로 검색하고 각 결과를 개별적으로 인쇄하려는 example.tar경우 ( 이것은example.tar$명령줄 프롬프트 명령의 일부가 아닌 새 줄의 시작을 나타내는 데 사용됨):

$ find . -name example.tar -exec sh -c 'tar -tf "$1" | wc -l' sh {} \;
3
3

그리고 디렉터리 이름 앞에 다음을 추가합니다.

$ find . -name example.tar -exec sh -c 'printf "%s: " "$1" && tar -tf "$1" | wc -l' sh {} \;
./example.tar: 3
./other/example.tar: 3

답변2

귀하의 문제는 작업 +에 연산자를 사용하는 데 있다고 생각합니다 . 이 연산자는 "결과를 공백으로 구분된 목록에 연결하고 해당 목록을 인수로 사용하여 지정된 명령을 실행합니다"를 의미합니다.-execfind+find

즉, example.tar서로 다른 경로에 여러 파일(예: 두 개) 이 있는 경우 -exec명령은 다음과 같습니다.

tar -tf /path/1/to/example.tar /path/2/to/example.tar

등. 그러나 이는 "파일이 있는지 확인"으로 해석됩니다./path/2/to/example.tarTAR 파일에서/path/1/to/example.tar”, 당연히 이래서는 안 됩니다.

코드를 다음으로 변경하면

find -name example.tar -exec tar -tf {} \; | wc -l

tar발견된 각 파일에 대해 개별적으로 명령을 실행 합니다 .

관련 정보