com zsh
:
autoload zmv # best in ~/.zshrc
zmv -n '/x/y/z/*_*_(*)/dicom/o*s002a*.nii' '${f:h}/$1.nii'
Ou:
zmv -n '/x/y/z/*_*_(*)/dicom/o*s002a*.nii' '/x/y/z/somedir/$1.nii'
Para movê-los para somedir
in /x/y/z
.
Remova o -n
para realmente fazer a renomeação depois que você estiver satisfeito de fazer o que quiser.
zmv
detectaria renomeações conflitantes antes de iniciar qualquer renomeação. Fazer algo semelhante com outros shells como bash
exigiria um script mais longo. Algo como:
#! /bin/bash -
typeset -A seen
shopt -s nullglob
for file in /x/y/z/*_*_*/dicom/o*s002a*.nii; do
tag=${file%/*/*}
tag=${tag##*_}
if [[ ${seen[$tag]} ]]; then
printf >&2 '"%s" and "%s" both map to "%s"\n' "$file" "${seen[$tag]}" "$tag"
exit 1
fi
seen[$tag]=$file
done
for tag in "${!seen[@]}"; do
echo mv -i -- "${seen[$tag]}" "/x/y/z/somedir/$tag"
done
(não testado)
(remova o echo
para realizar a renomeação).
Observe que as matrizes associativas bash
(ao contrário do ksh93 ou zsh) têm um erro / limitação, pois você não pode ter elementos com uma chave vazia. Portanto, se você tiver alguns arquivos foo_bar_/dicom/*.nii
, isso não funcionará corretamente, portanto, mesmo para essa abordagem programática, eu ainda usaria zsh
ou ksh93
em vez de bash
.