Em vez de tentar cd
para trás e para frente em diretórios ( popd
e pushd
são principalmente para uso interativo, de qualquer maneira):
#!/bin/sh
for name in */*; do
[ ! -f "$name" ] && continue
dir="$( basename "$( dirname "$name" )" )"
newname="$dir/${dir}_${name##*/}"
if [ ! -e "$newname" ]; then
echo mv "$name" "$newname"
fi
done
Isso itera sobre todos os nomes em todos os diretórios no diretório atual. Ele ignorará os arquivos que não foram arquivos e extrairá o nome de base do diretório (o nome do diretório sem caminho) em dir
. Em seguida, ele constrói um novo nome de arquivo, $newname
, para o arquivo usando $dir
e a parte de nome de base do nome do caminho em $name
( ${name##*/}
pode ser substituída por $( basename "$name" )
).
Se o novo nome ainda não tiver sido recebido, o arquivo será renomeado.
Remova o echo
para realmente renomear os arquivos depois de verificar se ele deve fazer a coisa certa.
Para executar um conjunto de ações em outro diretório e depois voltar, use
( cd dir
action
action
action )
O diretório alterado não influencia o ambiente fora do ( ... )
.
Veja também: Por que * not * pars 'ls'?