-exec를 사용하는 동안 find 명령에서 파일 이름을 어떻게 출력합니까?


33

다음 줄을 사용하여 PWD의 모든 하위 디렉토리를 찾고 svnadmin verify각 디렉토리에서 실행 합니다 (이미 Subversion 저장소라는 것을 이미 알고 있습니다)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

출력이 다음과 같은 사실 외에는 잘 작동합니다.

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

로깅을 쉽게하기 위해 명령을 find실행하기 전에 파일 이름을 인쇄 하고 싶습니다 svnadmin verify.

나는 ls거기에 조금 짜내려고 노력 했지만 그것을 굳혔습니다. 어떻게해야합니까 (간단히 간단합니까)?

답변:


36

-printf옵션을 추가 하기 전에

find -printf '%p' -exec command \;

4
Lovely, 나는 그 이름이 자체 라인의 확인 출력 앞에 오도록 변경 '%p'했습니다 '%p\n'.
Arronical

17
@Arronical 그것이 당신이 원하는 포맷이라면, (포맷 된) -printf '%p\n'더 간단한-print
스틸 드라이버로

4
find -name <a_name> -print -exec command {} \;
toliveira

14

재귀를 원하지 않으면을 사용할 필요가 없습니다 find. 쉘에서 직접 수행하는 것이 훨씬 간단합니다.

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */모든 디렉토리를합니다 (찾을 */디렉토리에만 보장하고 어떤 파일이 발견된다); 는 echo "$d"디렉토리의 이름을 인쇄합니다; 는 svnadmin verify "$d"디렉토리를 확인합니다.

명령 줄에서 직접 또는 형식 변경없이 스크립트 내에서 실행할 수 있습니다.


1
이것은 내 목표를 달성하는 더 좋은 방법처럼 보이지만 제목과 질문이 find너무 많이 언급 되어 있기 때문에 Fiximan에 대한 답변을 제공해야했습니다 . 그래도 내 지식을 향상시켜 주셔서 감사합니다!
Arronical

글로브를 사용해야합니다. 글 로빙 (Globbing)은 확실히 유용하고 강력하지만 개인 경험에서 구문을 설정하기가 더 어려우며 종종 더 길고 복잡한 스크립트를 만드는 bash dotglob와 같은 다른 것들이 필요 globstar합니다. 나는 복잡한 작업을 위해 글로브를 저장하는 경향이 있지만 find, 많은 필터와 명령을 하나의 라이너로 묶는 것만으로 구문을 쉽게 던질 수 있습니다.
user5359531

@ user5359531 여기서 globstar 나 dotglob (숨겨진 파일이 있고 실제로 원하지 않는 한)가 필요하지 않습니다. 이것은 분명히 의견의 문제이지만 당신은 내가 처음으로 만난 사람 중 가장 둔한 형식을 find단순한 사람이라고 생각합니다 . 나는 find그것들을 훨씬 간단하게 찾을뿐만 아니라 다른 프로그램으로 전달되는 임의의 파일 이름을 다룰 때 더 안전하기 때문에 항상 글로브를 선호 합니다.
terdon

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

-type d디렉토리 만 있으면 추가 했습니다.


나는 {}적어도 인용한다svnadmin verify {}
kos

빠른 응답에 감사드립니다. 따라서이 명령에서-exec; 에서 줄 끝으로 사용하여 2 개의 명령이 실행되는 자식 쉘을 생성 합니까?
Arronical

5

이 시도:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

디렉토리를 원한다면 (@kos note에 감사합니다) :

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

멋지지만 파일도 처리합니다 : for f in */디렉토리 만 처리합니다
kos

이것은 스크립트에서만 작동합니까? 아니면 명령 행에서 발행 할 수 있습니까?
Arronical

1
@Arronical은 커맨드 라인으로도 작동합니다
Maythux

2
  • . -maxdepth 1대신에 사용 ./*하면 폴더 구조의 첫 번째 수준 만 필요합니다
  • 사용 -type d, 폴더 만 필요
  • 용도 ! -name "." , 당신은 필요하지 않습니다.
  • 용도 -exec쉘을 시작하는 데
  • 용도 sh -c쉘 내부에서 명령을 시작하는 데

당신의 명령

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

또는 더 짧은

  • 용도 -prune파일이 디렉토리 인 경우

당신의 명령

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-prune재미있어 보인다. find 명령에서 ./* -maxdepth 0돌아 오는 것을 피하기 위해 사용 되었습니다 .. 심각한 오류는 발생하지 않지만 출력에 포함시키지 않는 것이 좋습니다.
Arronical

1

find다른 답변에서 이미 언급 한 인쇄 옵션 플래그가 있습니다. 현재 처리 된 동일한 파일에 대해 여러 명령을 실행하는 관점에서 문제를 보면 find여러 -exec문을 사용할 수 있습니다 . 이는 다음을 사용하도록 선택할 수 있음을 의미합니다.

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

다시 말하지만,이 방법 단지로 인쇄하지에 적용하는 것으로 echo, printf또는 기타 유틸리티뿐만 아니라 다른 명령.


0

find출력을 read루프 로 파이프하는 것이 유용 할 수 있습니다 .

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

find이 멋진 ls예제 에서와 같이 파일 이름을 반환하여 더 복잡한 복합 명령 시퀀스를 실행할 수 있습니다 .

find . | while read f; do echo ${f} | figlet -k; done

-1

파일의 이름과 내용을 재귀 적으로 만 인쇄합니다.

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.