linha de comando do Linux. Mover todos os arquivos e diretórios no diretório, exceto alguns arquivos e diretórios

7

Eu tenho uma pasta A que tem arquivos e diretórios, desejo mover todos esses arquivos e diretórios para outra pasta B , exceto file , file2 , directory e directory2 .

Como isso pode ser feito?

    
por somethingSomething 09.09.2014 / 11:13

7 respostas

9

com zsh :

setopt extendedglob # best in ~/.zshrc
mv A/^(file|directory)(|2)(D) B/

(os arquivos (D) para incluir ponto (ocultos)).

com bash :

shopt -s extglob dotglob failglob
mv A/!(@(file|directory)?(2)) B/

com ksh93

(FIGNORE='@(.|..|@(file|directory)?(2))'; mv A/* B)
    
por 09.09.2014 / 12:10
10

o que eu costumo fazer

cd A
ls > a

(supondo que você não tenha nenhum arquivo 'a').

vi a

remova qualquer arquivo ou diretório a ser mantido no lugar.

mv $(<a) B
    
por 09.09.2014 / 11:24
5

Você pode usar find com expressões excluídas:

find . ! -name . -prune ! -path ./file \
                        ! -path ./file2 \
                        ! -path ./directory \
                        ! -path ./directory2 \
     -exec mv {} your_destination \;

Esta solução é inspirada em esta questão .

    
por 09.09.2014 / 11:34
2
ls | egrep -v '(file|file2|directory|directory2)' | xargs -i mv {} ../B/
    
por 09.09.2014 / 17:38
1

Se ./A e ./B estiverem no mesmo sistema de arquivos e se esses arquivos ainda não existirem em ./B :

file file2 directory directory2

... então esta operação deve ser apenas atômica:

cd ./A; mv * ../B
for mv in file file2 directory directory2
do mv ../B/"$mv" .
done

Se não estiverem, então há pelo menos 8 cópias adicionais em dispositivos diferentes feitas com o conjunto de comandos acima.

    
por 09.09.2014 / 17:06
0

$ sudo mv (nome da pasta de origem) A B (nome da pasta de destino)

ex: criar dir vazia alguma sub pasta 1) sudo mkdir-p A / {b / {a, b, c}, c, d}

2) ls A /

b c d

3) sudo mkdir B

5) sudo mv a (pasta) b (pasta)

    
por 09.09.2014 / 14:52
0

Você pode usar uma matriz bash para armazenar quais deseja ignorar e usar a função containsElement demonstrada aqui :

$ skiplist=(file file2 directory directory2)
$ for f in *; do if containsElement "$f" "${skiplist[@]}"; then continue; fi;
mv -v "$f" B; done
    
por 09.09.2014 / 16:42