Bash: movendo condicionalmente diretórios duplicados aninhados

0

Suponha que eu tenha um diretório chamado "foo" que contenha vários diretórios:

foo/bar/bar/(files)
foo/bat/bat/(files)
foo/baz/qux/(files)

Existe uma maneira de mover condicionalmente o diretório "mais profundo" até um nível, de forma que ele substitua o diretório pai apenas se o nome dele corresponder ao nome do pai? Se não houver correspondência, o objetivo seria manter a estrutura de diretórios atual.

Saída desejada:

foo/bar/(files)
foo/bat/(files)
foo/baz/qux/(files)
    
por user259743 15.04.2014 / 23:38

2 respostas

0

Você pode usar find :

find . -regextype posix-awk -type d -regex ".*/(.*)/$" -exec sh -c "mv {}/* {}/../" \; -delete
  • -regextype posix-awk : precisamos usar posix-awk regextype para usar a referência anterior ( )
  • -type d : segmenta diretórios
  • -regex ".*/(.*)/$" : segmenta arquivos correspondentes a */bar/bar
  • -exec sh -c "mv {}/* {}/../" : move diretórios direcionados para seus diretórios pais
  • -delete : elimina diretórios direcionados

Observação: você não pode usar rmdir {} dentro de -exec ( find retornará um erro No such file or directory ), você precisa usar a opção -delete após -exec .

    
por 16.04.2014 / 18:46
0

Não testado:

DIR=foo
ls $DIR | while read SUBDIR ; do
  [ -d $DIR/$SUBDIR/$SUBDIR ] || continue
  mv $DIR/$SUBDIR/$SUBDIR/* $DIR/$SUBDIR/
  rmdir $DIR/$SUBDIR/$SUBDIR
done
    
por 16.04.2014 / 17:13

Tags