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 caracteres curinga *
e regex ...
Alguém tem ideias?
mv **/*(.) ./other_directory
- com o bash, você precisará recorrer a comandos externos como essefind
.Respostas:
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 no tipo de arquivo ou em outras características. Há uma maneira de corresponder por tipo: adicionar
/
no final do padrão faz corresponder apenas diretórios ou links simbólicos aos diretórios. Dessa forma, você pode mover diretórios, depois mover o que resta e mover diretórios de volta - pesado, mas funciona.Uma maneira padrão de corresponder arquivos por tipo é ligar
find
.No zsh, você pode usar os qualificadores glob para corresponder aos arquivos por tipo. O
.
qualificador corresponde aos arquivos regulares; use^/
para corresponder a todos os não diretórios ou-^/
também para incluir links simbólicos para diretórios.Em qualquer shell, você pode simplesmente fazer um loop.
fonte
Você poderia usar algo como
Primeiro, usamos
find
apenas para procurar no diretório atual, depois ignoramos os diretórios usando! -type d
finalmente executamossh
e movemos tudo para o diretório de destino. Você pode tentar{} +
no final o que será mais rápido.fonte
-exec sh -c 'mv "$@" MYDIR' _ {} \;
vez de-exec mv {} MYDIR \;
? Apenas para obter algo que possa ser simplificado alterando o\;
para a+
? Você pode fazer isso com o-exec mv -t MYDIR {} +
formulário.-t
bandeira. Expliquei também na resposta que a versão+
é mais rápida, mas nem todas asfind
versões suportam. Portanto, o código acima é praticamente compatível com qualquerfind
shell ou que é usado.find
shell ou que é usado.” É verdade, mas éfind … -exec mv {} MYDIR \;
, e usa menos recursos que… -exec sh -c 'mv "$@" MYDIR' _ {} \;
.É potencialmente um pouco perigoso, mas
Como cp e rm não funcionarão em diretórios sem a opção -r.
fonte
Eu sugeriria simplesmente fazer
mv *.* destination/
com o destino / ser a pasta para a qual você está se movendo.fonte
*.*
, alguns diretórios são movidos e alguns arquivos são deixados, o que não é o que o solicitante queria.fonte