파일 반복을 위한 Bash 스크립트

파일 반복을 위한 Bash 스크립트

다음 bash 루프가 있습니다.

for file in /home/directory/*; do
filename=${file##*/}
echo "$filename"
##execute command here with $filename
done

특정 파일만 선택하는 방법은 무엇입니까? 예를 들어 test-file.zip과 같이 파일 이름에 "마스크"가 없는 파일만 선택합니다. 또한 각 루프 반복에서 "마스크"가 추가된 변수(test-file-mask.zip)를 선언하려고 합니다. 어떻게 해야 하나요?

편집하다:

좀 더 정확해야 할 것 같습니다. ;) 예를 들어, 파일이 많은 폴더가 있습니다

test_001.nii.gz
test_001-mask.nii.gz
test_002.nii.gz
test_002-mask.nii.gz
....

이는 각 파일에 대해 "마스크" 파일도 있음을 의미합니다. 이제 각 루프 반복에서 마스크되지 않은 파일과 마스크된 파일을 선택하고 싶습니다. 예를 들어, 첫 번째 루프 반복에서 $file은 test_001.nii.gz를 가리켜야 하고, $mask는 test_001-mask.nii.gz를 가리켜야 하며, 두 번째 루프 반복에서 $file은 test_002.nii.gz를 가리켜야 합니다. $mask는 test_002.nii.gz를 가리켜야 합니다. test_002-mask.nii.gz 등

답변1

에서 [[ ... ]]a의 오른쪽은 ==패턴이 될 수 있습니다.

for file in /home/directory/* ; do
    if [[ $file != *-mask.nii.gz ]] ; then
        filename=${file##*/}
        mask=${filename%.nii.gz}-mask.nii.gz
        echo "$filename" "$mask"
    fi
done

답변2

사용 findsed:

#!/bin/bash
find /home/directory/* -type f -name '*.gz' \
-not -name '*mask*' | while IFS= read -r file; do

    mask="$(sed 's/^\([^.]*\)/\1-mask/' <<<"$file")"

done

문자열을 포함하지 않는 디렉토리 이름을 고려하십시오 mask.

관련 정보