Mova todos os arquivos que não sejam um diretório

11

Eu tenho um diretório que estou tentando limpar que contém arquivos e subdiretórios. O que estou tentando fazer é simples: mova todos os arquivos para outro diretório, mas deixe todos os subdiretórios como estão.

Estou pensando em algo como:

mv [*_but_no_dirs] ./other_directory

Parece que deve haver uma maneira simples de fazer isso com curingas * e regex ...

Alguém tem ideias?

    
por Questionmark 29.07.2014 / 20:29

4 respostas

11

O Regex não está envolvido aqui. Os curingas no bash (como a maioria dos outros shells) correspondem apenas aos arquivos com base nos nomes dos arquivos, não com base no tipo de arquivo ou em outras características. Há uma maneira de combinar por tipo: adicionar / no final do padrão faz com que ele corresponda apenas a diretórios ou links simbólicos a diretórios. Dessa forma, você pode mover diretórios, depois mover o que sobrou e mover diretórios de volta - complicado, mas funciona.

tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"

Uma maneira padrão de corresponder arquivos por tipo é chamar find .

find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +

No zsh, você pode usar os qualificadores para corresponder os arquivos por tipo. O qualificador . corresponde a arquivos regulares; use ^/ para corresponder a todos os não diretórios ou -^/ para incluir também links simbólicos para diretórios.

mv -- *(.) other_directory/

Em qualquer shell, você pode simplesmente fazer um loop.

for x in *; do
   if ! [ -d "$x" ]; then
     mv -- "$x" other_directory/
   fi
done
    
por 30.07.2014 / 02:19
8

Você poderia usar algo como

find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv  "$@" MYDIR' _ {} \;

Primeiro, usamos find para procurar apenas dentro do directoy atual, então ignoramos os diretórios usando ! -type d , finalmente, executamos sh e movemos tudo para o diretório de destino. Você pode tentar {} + no final, que será mais rápido.

    
por 29.07.2014 / 20:42
0

É potencialmente um pouco perigoso, mas

cp * destination/
rm *

Como cp e rm não operam em diretórios sem a opção -r.

    
por 08.05.2018 / 16:52
-1

Eu sugeriria simplesmente fazer mv *.* destination/ com destino / sendo a pasta para a qual você está se movendo.

    
por 03.12.2016 / 02:10