Uma abordagem um tanto ingênua:
#!/bin/sh
for dir do
# get list of directories under the directory $dir
set -- "$dir"/*/
# if there are more than one, continue with the next directory
# also continue if we didn't match anything useful
if [ "$#" -gt 1 ] || [ ! -d "$1" ]; then
continue
fi
# the pathname of the subdirectory is now in $1
# move everything from beneath the subdirectory to $dir
# (this will skip hidden files)
mv "$1"/* "$dir"
# remove the subdirectory
# (this will fail if there were hidden files)
rmdir "$1"
done
Usando bash
:
#!/bin/bash
for dir do
# get list of directories under the directory $dir
subdirs=( "$dir"/*/ )
# if there are more than one, continue with the next directory
# also continue if we didn't match anything useful
if [ "${#subdirs[@]}" -gt 1 ] || [ ! -d "${subdirs[0]}" ]; then
continue
fi
# the pathname of the subdirectory is now in ${subdirs[0]}
# move everything from beneath the subdirectory to $dir
# (this will skip hidden files)
mv "{subdirs[0]}"/* "$dir"
# remove the subdirectory
# (this will fail if there were hidden files)
rmdir "${subdirs[0]}"
done
Ambos os scripts seriam executados como
$ ./script.sh dir1 dir2 dir3
ou
$ ./script.sh */
para executá-lo em todos os diretórios no diretório atual.
Além das ressalvas no código, isso também deixaria de vincular os links simbólicos. Para fazer isso, você teria que percorrer todos os locais possíveis no sistema de arquivos e procurar por links apontando para o subdiretório em /folder
e recriá-los para que apontem para o novo local correto. Eu não vou escrever o código tão longe aqui.
Além disso, nenhuma verificação é feita ao mover as coisas para fora do subdiretório para garantir que não haja entradas com os mesmos nomes já existentes em /folder
.