나는 파일을 추출하기 위해 경로를 사용합니다 find
. 경로 명령 find
은 다음과 같습니다.
tmp=$(find $Some_Dir -name "*.gz")
출력은 다음과 같습니다
echo "$tmp"
/xxxx/abc/bcd/def/something/ZRT834/ZRT834_9/5678/S1_L001_R1.gz /xx/abc/bcd/def/ddd/ZRT834/ZRT834_9/5678/S2_L001_I1.gz /abc/bcd/def/ZRT834/ZRT834_9/5678/S1_L001_I2.gz /abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_R1.gz /abc/bcd/def/hfgdh/ZRT207/ZRT207_1/5678/S1_L001_R2.gz /abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_I2.gz /sgdj/hbsdj/ldnc/jnjdss/ZRT102_9/S5_L002_I1.gz
하위 디렉터리를 만들고 일치하는 패턴을 기반으로 심볼릭 링크를 만들고 싶습니다. 예를 들어, 각 경로에서 ZRT
시작하고 끝나는 패턴을 일치시키고 _somenumber
존재하지 않는 경우 해당 경로 요소로 하위 디렉터리를 생성하려고 합니다. 그런 다음 파일에 대한 기호 링크를 .gz
해당 디렉터리에 만듭니다.
출력은 다음과 같아야 합니다. , 등의 ZRT834_9
기호 링크가 있는 디렉터리입니다 .S1_L001_R1.gz
S2_L001_I1.gz
S1_L001_I2.gz
편집: 이것은 내 원래 질문입니다. 또한 이전에 덜 복잡한 질문을 게시했습니다.여기.
답변1
에 대한 tmp=$(find $Some_Dir -name "*.gz")
:
- 항상 쉘 변수를 인용하십시오(예:
"$Some_Dir"
, 뿐만 아니라$Some_Dir
).https://mywiki.wooledge.org/Quotes. - 파일 이름을 스칼라 변수로 읽는 대신, 그렇게 하면 파일 이름의 공백을 처리하기가 더 어려워지기 때문에 배열로 읽어 들이십시오.
따라서 다음과 같아야 합니다.
readarray -d '' files < <(find "$Some_Dir" -type f -name '*.gz' -print0)
이제 다음과 같이 파일을 반복하여 원하는 작업을 수행할 수 있습니다 I want to match the pattern starting with ZRT and ending with _somenumber
.
re='ZRT.*_somenumber'
for file in "${files[@]}"; do
if [[ $file =~ $re ]]; then
do whatever you like
fi
done
분명히 처음에는 파일 배열이 필요하지 않으며 다음 출력을 반복할 수 있습니다 find
.
re='ZRT.*_somenumber'
while IFS= read -r -d '' file; do
if [[ $file =~ $re ]]; then
do whatever you like
fi
done < <(find "$Some_Dir" -type f -name '*.gz' -print0)
답변2
파일을 찾는 동안 즉시 이 작업을 수행할 수 있습니다.
find Dir/ -name '*.gz' -regex '.*/ZRT[^/]*_[0-9]+/.*' -exec \
bash -c ': "$(grep -o "/ZRT[^/]*_[0-9]\+/" <<<"$0")";\
mkdir -p "${_#/}"; ln -s "$0" "${_#/}"' {} \;