xargs 파이핑 후 파이프 명령

xargs 파이핑 후 파이프 명령

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

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

디렉토리 이름(디렉토리 name 에 포함된 이름 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, 그것은 또한 제가 원하는 것이 아닙니다.

답변1

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

-I replace-str

    발생 교체교체-str초기 인수에서는 표준 입력에서 이름을 읽습니다. 또한 따옴표가 없는 공백은 항목을 종료하지 않으며 대신 구분 기호는 개행 문자입니다. 의미 -x하고 -L 1.

그래서,

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

echo에서 찾은 디렉터리를 찾은 find다음 ls | tail해당 디렉터리에서 작업을 수행합니다.

답변2

fredtantini 외에도 일반적인 참고 사항은 다음과 같습니다(문서가 약간 혼란스럽기 때문에).

표준 입력에서 "{}" 문자를 가져와 xargs -I {}파이프에서 나오는 문자로 대체합니다. 이는 사실상 {}모든 문자 조합을 대체할 수 있음을 의미합니다(아마도 선호하는 프로그래밍 스타일에 더 적합하도록).예를 들어: xargs -I % sh -c "echo %". 항상 를 사용하는 경우 약칭이므로 xargs -I {}로 바꿀 수 있습니다 .xargs -i편집하다: 이 xargs -i옵션은 더 이상 사용되지 않으므로 계속 사용하세요 xargs -I{}.

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

xargs -I {} sh -c "echo {}"당신이 생성한 입력을 읽습니다 . 파이프에서 얻은 매개변수로 바꾸라고 지시했기 때문에 이런 일이 발생합니다.sh -cecho {}{}

파이프가 없어도 터미널에 위 명령어를 입력하면 쉽게 테스트할 수 있습니다. 다음에 쓰는 모든 내용은 터미널에 출력됩니다(종료하려면 Ctrl-D).

ls -la {}명령에서도 같은 일이 다시 발생합니다 . {}파이프라인 이전 명령의 내용으로 대체되었습니다 .

답변3

GNU Parallel을 사용하면 이러한 작업이 쉬워집니다.

find . -type d -name "*log*" | parallel --tag "ls -la {} | tail -2"

GNU Parallel을 완전히 설치하고 싶지 않다면 최소 설치만 하면 됩니다:http://git.savannah.gnu.org/cgit/parallel.git/tree/README

관련 정보