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 -c
echo {}
{}
파이프가 없어도 터미널에 위 명령어를 입력하면 쉽게 테스트할 수 있습니다. 다음에 쓰는 모든 내용은 터미널에 출력됩니다(종료하려면 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