폴더를 순환하고 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
귀하의 문제는 작업 +
에 연산자를 사용하는 데 있다고 생각합니다 . 이 연산자는 "결과를 공백으로 구분된 목록에 연결하고 해당 목록을 인수로 사용하여 지정된 명령을 실행합니다"를 의미합니다.-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
발견된 각 파일에 대해 개별적으로 명령을 실행 합니다 .