하위 디렉터리를 추출하고 경로의 일치하는 패턴을 기반으로 심볼릭 링크를 만듭니다.

하위 디렉터리를 추출하고 경로의 일치하는 패턴을 기반으로 심볼릭 링크를 만듭니다.

나는 파일을 추출하기 위해 경로를 사용합니다 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.gzS2_L001_I1.gzS1_L001_I2.gz

편집: 이것은 내 원래 질문입니다. 또한 이전에 덜 복잡한 질문을 게시했습니다.여기.

답변1

에 대한 tmp=$(find $Some_Dir -name "*.gz"):

  1. 항상 쉘 변수를 인용하십시오(예: "$Some_Dir", 뿐만 아니라 $Some_Dir).https://mywiki.wooledge.org/Quotes.
  2. 파일 이름을 스칼라 변수로 읽는 대신, 그렇게 하면 파일 이름의 공백을 처리하기가 더 어려워지기 때문에 배열로 읽어 들이십시오.

따라서 다음과 같아야 합니다.

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" "${_#/}"' {} \;

관련 정보