我有以下 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
使用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
。