*.plist
나는 디렉터리에 있는 모든 파일을 재귀적으로 찾아 작업하는 스크립트를 하나로 묶으려고 합니다 . 스크립트는 다음과 같지만 예상치 못한 결과가 발생합니다.
예상되는 결과는 각 파일 이름이 다음과 같이 인쇄되는 것입니다.
File: XXX
File: YYY
File: ZZZ
문제 for file in "$FILES"
는아니요한 번에 하나의 파일을 보냅니다. 대신 전체 목록을 한 번에 전송하므로( FILES
collect 사용 find
) 결과는 다음과 같습니다.
File: XXX
YYY
ZZZ
실제 출력은 아래에 표시되어 있지만 위의 출력은 이에 대한 정확한 요약입니다.
변수의 각 파일을 통해 쉘 루프를 어떻게 만들 수 있습니까 FILES
?
#! /bin/sh
do_test_file() {
FILE="$1"
echo "File: $FILE"
# echo `ls -al "$FILE"`
echo ""
}
do_test_dir() {
DIR="$1"
FILES=`find "$DIR" -name "*.plist" 2>/dev/null`
for file in "$FILES"
do
if [ ! -d "$file" ] && [ ! -L "$file" ]; then
do_test_file "$file"
fi
done
}
########################################
ARG="$1"
if [ -z "$ARG" ]; then
echo "Please invoke with a file or directory to search"
exit 1
fi
if [ -d "$ARG" ]; then
do_test_dir "$ARG"
else
do_test_file "$ARG"
fi
$ ./plist-dump.sh .
File: ./916CD34C-4D41-41B7-9266-2DCAC416E2D1/.com.apple.mobile_container_manager.metadata.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/iTunesMetadata.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/ResourceRules.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/Info.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/Settings.bundle/Root.plist
./916CD34C-4D41-41B7-9266-2DCAC416E2D1/example.app/SC_Info/Manifest.plist
답변1
아마도 find 자체에서 -exec 함수를 찾고 있을 것입니다.
find "${DIR}" -name "*.plist" -type f -exec echo "무엇인가를 하세요" {} \;
그것을 파괴:
- -찾은 것이 파일인지 확인하기 위한 유형 테스트
- -exec는 코드를 실행합니다....
- 에코 "뭐 좀 해봐"
- {}는 이 반복 중에 작업 중인 파일을 나타냅니다.
- \;코드 문을 닫고 다음 반복으로 돌아갑니다.
이렇게 하면 스크립트가 단순화될 수 있습니다.
답변2
단일 값(find의 전체 출력)을 사용하여 변수 FILES를 생성합니다. 한 가지 해결책은 배열을 사용하는 것입니다. 예를 들면 다음과 같습니다.
FILES=($(find . -name "*.txt" 2>/dev/null))
그리고 나중에
for file in "${FILES[@]}"
$()
백틱`` 대신 명령 대체를 사용해야 합니다 .