다음 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
사용 find
및 sed
:
#!/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
.