programing

"find" 명령어 결과를 Bash에 배열로 저장하려면 어떻게 해야 합니다.

lastmoon 2023. 4. 22. 09:59
반응형

"find" 명령어 결과를 Bash에 배열로 저장하려면 어떻게 해야 합니다.

는 그 .find 코드과 같습니다을 사용하다

#!/bin/bash

echo "input : "
read input

echo "searching file with this pattern '${input}' under present directory"
array=`find . -name ${input}`

len=${#array[*]}
echo "found : ${len}"

i=0

while [ $i -lt $len ]
do
echo ${array[$i]}
let i++
done

.txt.txt 2번입니다.는 '2'를 '합니다.${len} 1.하다, 1. 하다, 1. 하다 라고 합니다.는 모든 가 다 반영되기 때문입니다.find하나의 요소로서.떻게하 하칠 ?칠? ????


Stack Over Flow stack stack stack 。다만, 조금 다르기 때문에, 제 경우는 신청할 수 없습니다.루프 전에 결과를 변수에 저장해야 합니다.다시한번 감사합니다.

Linux 사용자용 업데이트 2020:

Linux와 마찬가지로 bash의 최신 버전(4.4-alpha 이상)이 있는 경우 Benjamin W.의 답변을 사용해야 합니다.

마지막으로 확인한 Mac OS에서 bash 3.2를 사용하고 있거나 이전 bash를 사용하고 있는 경우 다음 섹션으로 넘어갑니다.

bash 4.3 이전의 응답

결과를 얻기 한 솔루션입니다.findbash 스위칭:

array=()
while IFS=  read -r -d $'\0'; do
    array+=("$REPLY")
done < <(find . -name "${input}" -print0)

일반적으로 파일 이름에는 공백, 새 행 및 기타 스크립트호스트 문자를 사용할 수 있기 때문에 이것은 어렵습니다.「 」를 사용하는 find하시면 됩니다.-print0Bash's Bash의 경우 큰 입니다.readarray/mapfile함수는 null로 구분된 문자열을 지원하지만 지원하지 않습니다.쉬의read그러면 위의 루프가 나타납니다.

[이 답변은 원래 2014년에 작성되었습니다]최신 버전의 bash가 있는 경우 아래 업데이트를 참조하십시오.]

구조

  1. 배열을 : the 、 번 、 첫 、 the 、 the 、 the:::: 。array=()

  2. 그때마다read문이 실행되고 null로 구분된 파일 이름이 표준 입력에서 읽힙니다.-r을 지정하면, 「알 수 있습니다」라고 표시됩니다.read백슬래시 문자를 그대로 둡니다.-d $'\0'read무효은 하고 있기 read을 기본 이름인 "default name"으로 REPLY.

  3. array+=("$REPLY")에 새 파일 합니다.array.

  4. 합니다.find while 루우프

프로세스 대체를 사용하는 이유

프로세스 치환을 사용하지 않을 경우 루프는 다음과 같이 기록될 수 있습니다.

array=()
find . -name "${input}" -print0 >tmpfile
while IFS=  read -r -d $'\0'; do
    array+=("$REPLY")
done <tmpfile
rm -f tmpfile

에서는 '''의 출력입니다.find는 임시 파일에 저장되며 이 파일은 while 루프의 표준 입력으로 사용됩니다.프로세스 대체의 개념은 이러한 임시 파일을 불필요하게 만드는 것입니다.'이렇게'가 '이렇게'가 아니라whiletmpfile은 stdin, stdin stdin에서 수 <(find . -name ${input} -print0).

프로세스 대체는 널리 유용합니다.명령어가 파일에서 읽기를 원하는 많은 장소에서 프로세스 대체를 지정할 수 있습니다.<(...)파일 이름 대신.형태가 요.>(...)명령어가 파일에 쓰는 파일 이름 대신 사용할 수 있습니다.

어레이와 마찬가지로 프로세스 대체는 bash 및 기타 고급 셸의 기능입니다.POSIX 규격의 일부가 아닙니다.

대체: lastpipe

에 따라서, 「」를 참조해 주세요.lastpipe프로세스 대체 대신 사용할 수 있습니다(해트 팁:시저:

set +m
shopt -s lastpipe
array=()
find . -name "${input}" -print0 | while IFS=  read -r -d $'\0'; do array+=("$REPLY"); done; declare -p array

shopt -s lastpipe는 bash에게 (백그라운드가 아닌) 현재 셸의 파이프라인에서 마지막 명령을 실행하도록 지시합니다. 하면, 「 」는array는 파이프라인이 완료된 후에도 계속 존재합니다. ★★★★★★★★★★★★★★★★★★lastpipe되어 있는 .set +m(스크립트에서는 명령줄과 달리 작업 제어는 기본적으로 해제되어 있습니다).

기타 주의사항

다음 명령어는 셸 배열이 아닌 셸 변수를 만듭니다.

array=`find . -name "${input}"`

어레이를 작성하려면 find 출력 주위에 paren을 배치해야 합니다.따라서 순진하게 다음과 같이 할 수 있습니다.

array=(`find . -name "${input}"`)  # don't do this

이 조개껍데기 결과에 입니다.find어레이의 요소가 원하는 것을 보증하지 않도록 합니다.

업데이트 2019

4는 4.4-alpha bash를 .-d옵션을 지정하여 위의 루프가 더 이상 필요하지 않도록 합니다.대신 다음을 사용할 수 있습니다.

mapfile -d $'\0' array < <(find . -name "${input}" -print0)

이에 대한 자세한 내용은 Benjamin W.의 답변을 참조하십시오.

4는 Bash 4.4†를 했습니다.-d " " " option to " " option to " )readarray/mapfile하려면 , 「」를 사용해 주세요

readarray -d '' array < <(find . -name "$input" -print0)

공백, 줄 바꿈 및 글로벌 문자를 포함한 임의의 파일 이름으로 작동하는 메서드.는, 「」가 하게 됩니다.find는 「」를 서포트하고 있습니다.-print0GNU find dos를 찾습니다.

매뉴얼(기타 옵션 제외):

mapfile [-d delim] [array]

-d
의 첫 번째 문자는 줄바꿈이 아니라 각 입력 행을 종단하는 데 사용됩니다.가 빈 문자열인 경우mapfileNUL은 NUL로 합니다.

★★★★★★★★★★★★★★★★★.readarray는 그냥 of어일일 of of of of of of of is의 일 뿐입니다.mapfile.

다음은 MacOS의 Bash와 Z Shell 모두에서 작동하는 것으로 보입니다.

#! /bin/sh

IFS=$'\n'
paths=($(find . -name "foo"))
unset IFS

printf "%s\n" "${paths[@]}"

「 」를 사용하고 bash4를 할 수 .find 함께

shopt -s globstar nullglob
array=( **/*"$input"* )

**「」에 의해서 하게 된 globstar는 0개 이상의 디렉토리와 일치하므로 패턴이 현재 디렉토리의 임의의 깊이와 일치할 수 있습니다.nullglob옵션에서는 패턴(파라미터 확장 후)은 문자 그대로 처리되므로 일치하지 않으면 빈 배열이 아닌 단일 문자열로 배열이 됩니다.

, 그럼 여기에다가 더해져요.dotglob예: 「」등)를하는 경우에도, 첫 을 지정합니다..ssh 파일등)을.bashrc도 마찬가지입니다을 사용하다

이런 걸 시도해 볼 수 있어요

array=(`find . -type f | sort -r | head -2`)
, and in order to print the array values , you can try something like echo "${array[*]}"

readarray와 mapfile을 배우고 싶지 않았기 때문에 이러한 솔루션 중 어느 것도 나에게 적합하지 않았습니다.내가 생각해낸 건 이거야.

#!/bin/bash

echo "input : "
read input

echo "searching file with this pattern '${input}' under present directory"
# The only change is here. Append to array for each non-empty line.
array=()
while read line; do
    [[ ! -z "$line" ]] && array+=("$line")
done; <<< $(find . -name ${input} -print)

len=${#array[@]}
echo "found : ${len}"

i=0

while [ $i -lt $len ]
do
echo ${array[$i]}
let i++
done

다음과 같이 할 수 있습니다.

#!/bin/bash
echo "input : "
read input

echo "searching file with this pattern '${input}' under present directory"
array=(`find . -name '*'${input}'*'`)

for i in "${array[@]}"
do :
    echo $i
done

를 합니다.$(<any_shell_cmd>)는 명령어를 실행하여 출력을 캡처하는 데 도움이 됩니다.을 것을전전전 passing에 전하다IFS\n딜리미터로 지정하면 어레이로 변환할 수 있습니다.

IFS='\n' read -r -a txt_files <<< $(find /path/to/dir -name "*.txt")

언급URL : https://stackoverflow.com/questions/23356779/how-can-i-store-the-find-command-results-as-an-array-in-bash

반응형