O que é uma maneira conveniente de mover arquivos e subdiretórios “up a subdir” com possível conflito de nomes?

0

Eu tenho alguns arquivos e diretórios no diretório /var/foo/bar/baz . Agora, quero mover todos eles para /var/foo/bar e me livrar do baz. Fácil, certo?

cd /var/foo/bar
mv baz/* .
rmdir baz

(Estou ignorando arquivos que começam com. por causa dessa discussão)

mas! E se baz/ contiver um arquivo não-diretório chamado baz ? Eu posso movê-lo para outro lugar, ou usar um nome de arquivo temporário, exclua o diretório baz e, em seguida, mova-o para o lugar. Mas isso é tedioso e muitos comandos, também ... existe outra forma, costumeira, mais simples / mais elegante de fazer isso?

Nota:

  • Se houver outros conflitos de nomes, a semântica normal de mv , que é sobrescrever (e possivelmente solicitar), está bem. Mas com baz , não vai fazer isso, só vai falhar.
por einpoklum 03.04.2018 / 22:41

2 respostas

0

cd /var/foo/bar/baz
for src in *; do
    dest="${src}"
    suffix=0
    while [[ -e ../"${dest}" ]]; do
        dest="${src}.${suffix}"
        suffix=$((suffix+1))
    done
    mv -n "$src" ../"$dest"
done
cd ..
rmdir baz

Uma solução bastante simples. Prepare-se para mover um arquivo do diretório atual para o diretório pai, mas se já houver algo com esse nome, adicione um sufixo com um número. Mas certifique-se de não usar um número que também já exista por algum motivo.

A construção [[ -e file ]] retornará true se houver algo chamado file , seja um diretório, um soquete, um arquivo regular ou qualquer outro que possa existir.

    
por 03.04.2018 / 22:50
0

Isso é muito longo, mas deve funcionar:

cd /var/foo/bar
bazbaz_tmp_file=$(mktemp baz/XXXXXXXXXXXXXX)
[[ -e baz/baz ]] && mv baz/baz $bazbaz_tmp_file
mv baz/* .
rmdir baz
mv $(basename $bazbaz_tmp_file) baz

Nota: Isso pressupõe que possamos mover com segurança todos os outros arquivos de dentro de baz/ .

    
por 03.04.2018 / 23:10