Aqui está um script mais paranoico que evita todos os nomes de usuários (usa "@@@" para o diretório tmp), preserva os arquivos de pontos que o "mv $ a / homedir / *" descarta, pára se o @@@ dir isn ' t consistente e não deve ter um problema de comprimento de comando. A fraqueza restante é nomes de usuários patológicos.
cd /home
ls -1 | while read user ; do # allow many user dirs without imploding
[ -d @@@ ] && { echo tmp already present, aborting 1>&2 ; exit 1 ; }
mv $user @@@
mv @@@/homedir $user
rmdir @@@ || { echo tmp dir for $user not empty, aborting 1>&2 ; exit 2 ; }
done
A abordagem find () é uma boa escolha se todo o comando por diretório estiver enterrado no -exec, como em:
cd /home && find -name . -o -type d -prune -print \
-exec mv '{}' @@@ ';' \
-exec mv @@@/homedir '{}' ';' \
-exec rmdir @@@ ';'
Tentar algo como "for f in $(find ....)"
é frágil, já que os shells desejarão expandir toda a linha de comando primeiro. As descobertas mostradas aqui dependem de {} serem expandidas por find até mesmo dentro de strings, o que não tenho certeza se todas encontram suporte.
ou até mesmo
cd /home && find -name . -o -type d -prune -print -exec \
sh -c 'mv {} @@@ && mv @@@/homedir {} && rmdir @@@' ';'
Teste:
mkdir -p {fred,jan,alice}/homedir
touch {fred,jan,alice}/homedir/.dotstuff
touch {fred,jan,alice}/homedir/stuff
O deixa rasgar (menos o "cd / home") e veja como isto faz. Tudo parece funcionar bem aqui.