#!/bin/sh
for notes in ./???_notes.txt
do
if [ ! -f "$notes" ]; then
continue
fi
num=${notes%_notes.txt}
set -- "$num "*/
if [ "$#" -gt 1 ]; then
echo 'More than one directory found:' >&2
printf '\t%s\n' "$@" >&2
printf 'Skipping %s...\n' "$notes" >&2
continue
elif [ ! -d "$1" ]; then
printf 'No directory matching "%s" found\n' "$num */" >&2
printf 'Skipping %s...\n' "$notes" >&2
continue
fi
printf 'Would rename "%s" into "%s"\n' "$notes" "${1%/}.txt"
# mv -i "$notes" "${1%/}.txt"
done
Este script iria iterar todos os arquivos NNN_notes.txt no diretório atual. Para cada arquivo, o número NNN (que pode ser qualquer string de três letras) é extraído e usado para detectar qualquer diretório chamado NNN seguido por um espaço e uma string arbitrária.
Se um único diretório for encontrado, o arquivo será renomeado de acordo (a renomeação real é comentada por segurança). Se mais de um diretório ou nenhum diretório for encontrado, uma mensagem indicando isso é exibida.
A substituição do parâmetro ${variable%string} remove a string string do final do valor de $variable . O comando set , quando usado como neste script, define os parâmetros posicionais, $1 , $2 , $3 etc. para as coisas que correspondem ao padrão de globbing de nome de arquivo fornecido (neste script, queremos que o padrão seja corresponde exatamente a um diretório). O valor $# é o número de tais parâmetros posicionais.
A maneira como escrevi esse script, seria executável por bash e /bin/sh . Não usa nenhum "bashisms".
Uma versão bash -only:
#!/bin/bash
shopt -s nullglob
for notes in ./???_notes.txt
do
num=${notes%_notes.txt}
dirs=( "$num "*/ )
if [ "${#dirs[@]}" -gt 1 ]; then
echo 'More than one directory found:' >&2
printf '\t%s\n' "${dirs[@]}" >&2
printf 'Skipping %s...\n' "$notes" >&2
continue
elif [ "${#dirs[@]}" -eq 0 ]; then
printf 'No directory matching "%s" found\n' "$num */" >&2
printf 'Skipping %s...\n' "$notes" >&2
continue
fi
printf 'Would rename "%s" into "%s"\n' "$notes" "${dirs[0]%/}.txt"
# mv -i "$notes" "${dirs[0]%/}.txt"
done
A maior diferença aqui é que usamos uma matriz nomeada dirs para manter as possíveis expansões do padrão "$num "*/ e que usamos a opção nullglob shell para fazer com que os padrões de nome de arquivo não correspondentes sejam expandidos para nada. / p>