개행으로 구분된 파일 목록을 변수로 변환

개행으로 구분된 파일 목록을 변수로 변환

표적:나는 디렉토리에 있는 파일의 모든 인스턴스를 재귀적으로 *.clj찾고 *.cljs이를 문자열 변수(줄 바꿈으로 구분)에 저장한 다음 변환하려고 합니다.

clj(s)따라서 내 디렉터리에 다음 파일이 있으면 다음과 같습니다 dir1.

/dir1/dir2/hello1.clj
/dir1/dir2/hello2.clj
/dir1/dir2/hello3.cljs
/dir1/dir2/hello4.clj
/dir1/dir2/hello5.cljs

내 변환이 각 문자열의 기본 이름을 반환한다고 가정해 보겠습니다.

/dir1/dir2/hello1.clj -> hello1.clj
/dir1/dir2/hello2.clj -> hello2.clj
/dir1/dir2/hello3.clj -> hello3.clj
/dir1/dir2/hello4.clj -> hello4.clj
/dir1/dir2/hello5.clj -> hello5.clj

f그럼 어떻게 함수 를 작성할 수 있나요?

$ VAR=$(f dir1)

풀다

$ echo "$VAR"
  hello1.clj
  hello2.clj
  hello3.clj
  hello4.clj
  hello5.clj

?

시도:

나는 다음과 같이 디렉토리 .clj와 파일을 생성할 수 있다는 것을 알고 있습니다..cljs

FOUND_FILES=$(find "dir1" -type f -regex ".*\.\(clj\|cljs\)")

basename명령을 사용하여 파일의 기본 이름을 얻을 수 있습니다. 나머지는 어떻게 해야 할까요?

답변1

당신은 이것을 할 수 있습니다구체그리고매개변수 확장. 구문을 활성화해야 하는 bash 버전(bash4+)이 있는 경우에는 find필요하지 않습니다 .globstar**

# Enable `**`, and expand globs to 0 elements if unmatched
shopt -s globstar nullglob
# Put all files matching *.clj or *.cljs into ${files[@]} recursively
files=(dir1/**/*.clj{,s})
# Print all files delimited by newlines, with all leading directories stripped
printf '%s\n' "${files[@]##*/}"

임의의 변환을 적용하려면 마지막 줄을 다음으로 바꾸십시오.

for file in "${files[@]}"; do
    some-arbitrary-transformation <<< "$file"
done

답변2

shopt -s globstar nullglob
var="$(echo **/*.clj **/*.cljs | xargs -n1 basename)"
echo "$var"

관련 정보