표적:나는 디렉토리에 있는 파일의 모든 인스턴스를 재귀적으로 *.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"