두 개의 별도 변수를 기반으로 파일을 찾는 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
실행하려는 올바른 명령인 경우 제거하십시오).