用于循环文件的 Bash 脚本

用于循环文件的 Bash 脚本

我有以下 bash 循环。

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

如何只选择某些文件?例如,仅选择文件名中不带“mask”的文件,例如 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

相关内容