반환된 파일을 찾기 위해 반복하시겠습니까?

반환된 파일을 찾기 위해 반복하시겠습니까?

*.plist나는 디렉터리에 있는 모든 파일을 재귀적으로 찾아 작업하는 스크립트를 하나로 묶으려고 합니다 . 스크립트는 다음과 같지만 예상치 못한 결과가 발생합니다.

예상되는 결과는 각 파일 이름이 다음과 같이 인쇄되는 것입니다.

File: XXX
File: YYY
File: ZZZ

문제 for file in "$FILES"아니요한 번에 하나의 파일을 보냅니다. 대신 전체 목록을 한 번에 전송하므로( FILEScollect 사용 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[@]}"

$()백틱`` 대신 명령 대체를 사용해야 합니다 .

관련 정보