Script Bash para fazer o loop pelos arquivos

1

Eu tenho o seguinte laço bash.

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

Como posso selecionar apenas determinados arquivos? Por exemplo, selecionar apenas arquivos sem "máscara" no nome do arquivo, por exemplo, test-file.zip. Além disso, em cada iteração de loop eu quero declarar uma variável com uma "máscara" adicionada, ou seja, test-file-mask.zip. Como posso fazer isso?

Editar:

Eu acho que tenho que ser mais preciso. ;) Então eu tenho uma pasta com muitos arquivos, por exemplo

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

Isso significa que para cada arquivo, há também um arquivo "mask". Agora eu quero em cada iteração de loop para selecionar o arquivo sem máscara e o arquivo com máscara. Por exemplo, no primeiro arquivo de iteração de loop de loop deve apontar para test_001.nii.gz e $ mask deve apontar para test_001-mask.nii.gz e no arquivo de $ iteration do segundo loop deve apontar para test_002.nii.gz e $ mask para test_002-mask.nii.gz etc.

    
por machinery 13.05.2015 / 11:50

2 respostas

1

Usando find e sed :

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

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

done

Considere que qualquer nome de diretório não contém a string mask .

    
por 13.05.2015 / 13:06
2

Em [[ ... ]] , o lado direito de um == pode ser um padrão:

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
    
por 13.05.2015 / 11:57

Tags