2개의 변수 세트와 함께 find 사용

2개의 변수 세트와 함께 find 사용

두 개의 별도 변수를 기반으로 파일을 찾는 bash 스크립트에서 find 명령을 실행할 수 있기를 원합니다. 여기까지 왔지만 최종 결과를 어떻게 얻는지 모르겠습니다.

find . -user $userid -name $filename

제가 사용하고 싶은 매개변수 파일은 다음과 같습니다.

cat $uidscript  
10017:title  
10001:options.php  
10005:dump.php(235)  

그리고 변수에는 사용자 이름과 해당 사용자 이름이 소유한 파일이 포함됩니다.

사용자 ID와 파일 이름을 두 개의 별도 목록으로 분리해야 할 것 같습니다.

userid=$(cat $uidscript|cut -c1 -d':')
filename=$(cat $uidscript|cut -c2 -d':')`

for여기에서 find 명령을 루프 로 구성하는 방법을 잘 모르겠습니다 . 이런 식으로 흘러갈 것 같은데...

for i in $userid, $filename;
do 
    find . -user $userid -name $filename; 
done

누군가 나를 올바른 방향으로 밀어줄 수 있나요?

답변1

루프를 사용하여 while-read파일 행 처리

while IFS=: read userid filename
do
    find . -user "$userid" -name "$filename"
done < "$uidscript"

답변2

다른 옵션도 괜찮지만 접근 방식의 몇 가지 실수를 수정하고 싶습니다.

userid=$(cat $uidscript|cut -c1 -d':'):

  • -c필요한 캐릭터를 얻으세요필드. 사용 cut -f1 -d:.
  • cat의 쓸모없는 사용: 그냥 하세요: cut -f1 -d: <"$uidscript".
  • 결과와 다른 배열을 쉽게 반복할 수 있도록 결과를 배열에 저장합니다.

    IFS=$'\n'  # split on newline
    set -f     # disable the glob part of the split+glob operator
    userid=($(cut -f1 -d: <"$uidscript"))
    
  • 파일 이름은 동일합니다.

그런 다음 두 배열의 인덱스를 반복할 수 있습니다.

for i in "${!userid[@]}"
do 
    find . -user "${userid[i]}" -name "${filename[i]}"; 
done

답변3

다음을 수행할 수 있습니다.

IFS=:   # split on :
set -f  # disable glob part of the split+glob operator
echo find . $(
  awk -F: '
    {
      printf "%s", sep "(:-user:" $1 ":-name:" $2 ":):"
      sep = "-o:"
    }' < "$uidfile")

( echo실행하려는 올바른 명령인 경우 제거하십시오).

관련 정보