![찾기를 사용하여 파일 주문 및 인쇄 처리](https://linux55.com/image/4622/%EC%B0%BE%EA%B8%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EC%A3%BC%EB%AC%B8%20%EB%B0%8F%20%EC%9D%B8%EC%87%84%20%EC%B2%98%EB%A6%AC.png)
이 간단한 BASH 스크립트는 PHP 프로젝트에서 msgstr을 수집합니다.
#!/bin/sh
TARGET=/path/to/project
LPATH=locale/cy_GB/LC_MESSAGES
POFILE=messages.po
mkdir -p $LPATH
touch $TARGET/$LPATH/$POFILE
cd $TARGET
find . -name '*.php' -print | xargs xgettext -j --from-code=UTF-8 -o $TARGET/$LPATH/$POFILE
두 가지 질문이 있습니다.
-print가 찾은 파일을 나열하지 않는 이유는 무엇입니까? 모든 문서에 나열되어 있습니까?
find가 파일을 처리해야 하는 순서를 지정하는 방법이 있습니까? 동등한 PHP 스크립트를 실행하면 ls에 나열된 순서대로 파일을 처리한 다음 디렉토리로 이동합니다. 그러나 find는 파일이 뚜렷한 순서로 되어 있지 않고 디렉토리가 여기저기에 흩어져 있어서 자체적으로 작업을 수행하는 것 같습니다.
답변1
find
Bash와는 아무 관련이 없으며 Linux를 실행하는 경우 시스템에서 GNU findutils가 제공하는 별도의 유틸리티일 수 있습니다.
-print
파일이 나열되지만 필요하지 않습니다. 이것이 기본값입니다. 아마도 당신이 그것을 "보지" 못하는 이유는 그 출력이 xargs
표준 입력을 통해 취해지기 때문입니다. 그것은 결코 당신의 터미널에 도달하지 않습니다. 두 가지 모두에서 작동하도록 하려면 tee
또는 이와 유사한 것을 사용해야 합니다(신뢰할 수 없는 파일 이름을 얻은 경우 다음을 수행해야 합니다).언제나use -print0
, 이는 이식할 수 없는 확장이므로 여기에 포함되지 않습니다):
find . -name '*.php' |
tee >(xargs xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE")
find
파일은 정렬되지 않은 순서대로 인쇄됩니다. 정리하고 싶다면 sort
먼저 실행해야 합니다.
답변2
find . -name '*.php' -print
파일 이름 목록을 인쇄합니다. 이곳이 xargs
입력을 받는 곳 입니다 .
파일 이름에 공백이나 기타 특수 문자가 포함되어 있을 때 당황하지 않으려면 -print0
및xargs -0
find . -name '*.php' -print0 | xargs -0 xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE"
또는 다음 -exec
작업을 대신 사용하세요.
find . -name '*.php' -exec xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE" {} +
파일이 너무 많으면 xgettext
각 파일 배치에 대해 한 번씩 여러 번 실행됩니다. 이는 xargs
또는 를 사용하든 마찬가지입니다 -exec
. 이를 방지하려면 bash를 사용하고 있으므로 내장된 재귀 디렉터리 탐색 기능을 대신 사용하세요 find
.
shopt -s globstar
xgettext -j --from-code=UTF-8 -o "$TARGET/$LPATH/$POFILE" **/*.php
이렇게 하면 연결된 파일 이름이 명령줄 길이 제한을 초과하는 경우 자동으로 잘린 파일 대신 오류가 표시됩니다. Bash에서는 **/
디렉토리뿐만 아니라 디렉토리에 대한 심볼릭 링크도 순회됩니다. 문제가 발생하면 bash 대신 ksh나 zsh를 사용하거나 다른 방법을 사용하세요.
를 사용하는 경우 find
출력 파일을 계속해서 자동으로 덮어쓰는 것을 방지하려면 표준 출력에 쓰고 find
전체 명령을 파일로 리디렉션합니다.
find . -name '*.php' -exec xgettext -j --from-code=UTF-8 {} + >"$TARGET/$LPATH/$POFILE"
find
파일을 찾은 순서대로 나열하며 정렬은 수행하지 않습니다. 다른 파일 앞이나 뒤에 이름이나 디렉터리를 기준으로 정렬하지 마세요. (디렉터리는 파일입니다. 디렉터리 내에는 별도의 하위 디렉터리 및 기타 파일 목록이 없습니다.)
find
항상 디렉토리 자체 바로 뒤에 디렉토리의 내용을 나열하십시오. options 를 사용하면 -depth
상황이 반전됩니다. 먼저 디렉터리의 내용, 그다음 디렉터리 자체입니다.
답변3
대상 디렉터리에 하위 폴더가 없으면 및 으로 *
끝나는 모든 파일을 확장 해 볼 수 있습니다. 이렇게 하면 및 가 필요 하지 않습니다 ..php
xgettext
find
xargs
for i in ./*.php; do
xgettext -j --from-code=UTF-8 -o $TARGET/$LPATH/$POFILE $i
done
를 사용하여 재귀 검색을 수행해야 하는 경우 find
명령이 포함된 하위 쉘의 출력을 반복할 수 있습니다 find
.
for i in $(find . -name '*.php'); do
xgettext -j --from-code=UTF-8 -o $TARGET/$LPATH/$POFILE $i
done