폴더를 살펴보고 동일한 이름을 가진 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 {} +
tar
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
. 인수 도 누락되었습니다 [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
귀하의 문제는 의 작업 +
에 연산자를 사용하는 데 있다고 생각합니다 . 연산자 는 "결과를 공백으로 구분된 목록에 연결하고 해당 목록을 인수로 사용하여 지정된 명령을 실행합니다"를 의미합니다.-exec
find
+
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
발견된 각 파일에 대해 개별적으로 명령을 실행합니다 .