Mova cada arquivo para seu diretório pai no linux

0

Pergunta

Supondo que eu tenha

dir 1/dir 2/file 1
dir 3/dir 4/file 2

(espaços no diretório e nomes de arquivos são intencionais)

Eu quero acabar com

dir 1/file 1
dir 3/file 2

Respostas relacionadas mas incompletas

Esta resposta move todos os arquivos para o diretório pai atual (em vez do diretório pai de cada arquivo)

find . -maxdepth 1 -exec mv {} .. \;

Esta resposta imprime cada diretório pai, mas eu não sei como fazer o movimento.

find . -name '.user.log' | xargs -I{} dirname {}
    
por nwarp 23.03.2017 / 04:49

3 respostas

3
find -type f -execdir mv "{}" ../ \;

O -execdir é como -exec , mas faz seu trabalho em um diretório onde o arquivo específico está, portanto, a parte ../ funciona conforme necessário.

Para eliminar o vazio dir2 e dir4 no seu exemplo, você precisa de outro comando especializado, mas a tarefa principal está concluída.

    
por 23.03.2017 / 06:34
0

for x in */* ; do [ -d $x ] && ( echo cd $x ; echo pwd ; echo mv * .. ; echo cd ../.. ) ; done

Gosta do que você vê? Em seguida, remova a palavra echo (de vários locais)

Pode não funcionar em todos os casos, por ex. se links simbólicos são usados. Testado com o OpenBSD ksh (resultados preliminares pareciam bons em inspeção visual manual - eu não removi os comandos echo ).

Note que [ é um comando; ele compartilha a mesma página man como test (embora, como é um comando interno para o seu shell, você queira usar a página man do seu shell e procurar por documentação no comando).

    
por 23.03.2017 / 05:39
0

Você começou corretamente. No entanto, você pode estendê-lo um pouco em conjunto com o predicado -type para obter apenas arquivos. Usando xargs e os poderes abundantes de bash você tem

find . -maxdepth 3 -mindepth 3 -type f |xargs -n1 bash -c 'cd $(dirname $0) ; mv $0 ..'

$0 é o argumento posicional passado para bash por xargs. Para assisti-lo como acontece, você pode usar a opção -t para xargs as -tn1

Observação: limitei a profundidade da pesquisa usando -mindepth $D e -maxdepth $D , sinta-se à vontade para alterar de acordo com suas necessidades.

Nota 2: A resposta de Kamil (usando -execdir é realmente uma solução muito melhor).

    
por 23.03.2017 / 06:31