폴더를 반복하고 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 {} \;대신 필요합니다 . GNU에서는 다음과 같이 말합니다.tar -tf {} +tarman 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. 인수 도 누락되었습니다 [path...]. 예를 들어 BSD find의 일부 구현에서는 오류가 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발견된 각 파일에 대해 개별적으로 명령을 실행합니다 .

관련 정보