파이프 Xargs 후 파이핑 명령


38

HP-UX ***** B.11.23 U ia64 **** 무제한 사용자 라이센스

find . -type d -name *log* | xargs ls -la

디렉토리 이름 (디렉토리 이름에 포함 log된 이름)과 그 디렉토리 내의 모든 파일이 나옵니다.

디렉토리는  /var/opt/SID/application_a/log/,  /var/opt/SID/application_b/log/,  /var/opt/SID/application_c/log/등 로그 파일이 포함되어 있습니다.

ls명령 으로 두 개의 최신 로그 파일 만 나열하려고합니다 ls -latr | tail -2.

출력은 다음과 같아야합니다.

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2

find . -type d -name *log* | xargs ls -la | tail -2위의 결과를주지 않습니다. 내가 얻는 것은 find . -type d -name *log* | xargs ls -la명령 의 마지막 두 파일 목록입니다 .

파이프 후 명령을 파이프 할 수 xargs있습니까? 위의 형식으로 결과 파일 목록을 얻기 위해 어떻게 쿼리합니까?

find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"

현재 디렉토리 안에있는 10 개의 디렉토리 이름 목록을 제공하며 이는 /var/opt/SID내가 원하는 것이 아닙니다.


2
*log*그렇지 않으면 쉘이 확장 할 것임을 인용해야 합니다.
Anthon

알고 있어야 sh -c당신은 항상해야하므로, 두 번째 인수로 명령 이름 (매개 변수 0) 예상 find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail(통지 lstail될 것입니다 끝에서 $0생성 된 쉘을). 그렇지 않으면 첫 번째 결과가 해당 역할을 채우고 사용되지 않습니다.
Jonas

답변:


57

거의 다 왔습니다. 마지막 명령 -I에서 ls올바르게 수행하는 데 사용할 수 있습니다

-I replace-str

    초기 인수에서 replace-str 발생을 표준 입력에서 읽은 이름 으로 바꾸 십시오. 또한 인용되지 않은 공백은 입력 항목을 종료하지 않습니다. 대신 구분 기호는 개행 문자입니다. 의미 -x-L 1.

그래서

find . -type d -name "*log*" | xargs -I {} sh -c "echo {}; ls -la {} | tail -2"

당신은 것 echo에 의해 발견 된 디렉토리 find, 다음을 ls | tail그 위에.


검색 . -type d -name " 로그 "| xargs -I {} sh -c "echo {}; ls -ltr {} | grep -E \"file_in | file_out \ "| tail -5"이 것을 사용했습니다.
anotherperson1

3
나는xargs -n 1 sh -c 'echo $0'
Ginhing

1
맥 OS에 교체 때문에, 인용 명령 내에서 작동하지 않았다 echo $0도움 (더 이해)이었다
mpuncel

1
이 공간 사용하여 파일 이름과 함께 작동하도록하려면 -print0, xargs -0탈출 {}따옴표로 내부sh 명령find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
베네딕트 코펠

"xargs -n 1 sh -c"echo \ $ 0 | $ func "`$ func 변수를 사용해야하는 경우


2

fredtantini 외에도 일반적인 설명으로 (문서가 약간 혼란 스러우므로) :

xargs -I {}표준 입력에서 '{}'문자를 가지고 파이프에서 온다 무엇으로 대체됩니다. 이것은 실제로 {}모든 문자 조합으로 대체 할 수 있음을 의미합니다 (원하는 프로그래밍 방식에 더 적합 할 수 있음). 예를 들면 다음과 같습니다 xargs -I % sh -c "echo %". 당신이 항상 사용한다면 당신 은 속기대로 그것을 xargs -I {}대체 할 수 있습니다 xargs -i.

이것은 sh -cbash / shell에게 표준 입력이 아닌 문자열에서 다음 명령을 읽도록 지시합니다. 따라서 글쓰기 sh -c "echo something"는와 같습니다 echo something.

xargs -I {} sh -c "echo {}"당신이 만든 입력 읽을 수 sh -c있는가이다 echo {}. {}파이프에서 얻은 인수 로 바꾸라고 말했기 때문에 이것이 일어날 것입니다.

배관 없이도 쉽게 테스트 할 수 있습니다. 단말기에 위의 명령을 입력하십시오. 다음에 쓰는 내용은 터미널로 출력됩니다 (종료하려면 Ctrl-D).

에서 ls -la {}명령 같은 일이 다시 발생합니다. 는 {}프리 파이프 명령의 내용이 교체된다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.