Como movo todos os arquivos em um diretório (incluindo os ocultos) para outro diretório?
Por exemplo, se eu tiver uma pasta "Foo" com os arquivos ".hidden" e "notHidden" dentro, como movo os dois arquivos para um diretório chamado "Bar"? O seguinte não funciona, pois o arquivo ".hidden" permanece em "Foo".
mv Foo/* Bar/
Tente você mesmo.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Respostas:
Zsh
ou
(Deixe de fora
(N)
se você sabe que o diretório não está vazio.)Bater
Ksh93
Se você souber que o diretório não está vazio:
Padrão (POSIX) sh
Se você deseja permitir que o
mv
comando retorne um status de erro, embora tenha sido bem-sucedido, é muito mais simples:GNU find e GNU mv
Localização padrão
Se você não se importa de mudar para o diretório de origem:
Aqui estão mais detalhes sobre como controlar se os arquivos de ponto são correspondidos no bash, ksh93 e zsh.
Bater
Defina a
dotglob
opção .Há também a
GLOBIGNORE
variável mais flexível , que você pode definir para uma lista separada por dois pontos de padrões curinga para ignorar. Se nãodotglob
estiver definido (a configuração padrão), o shell se comportará como se o valor estivesse vazio se estiver definido e como se o valor estivesse.*
se a opção não estiver definida . Consulte Expansão do nome do arquivo no manual. Os diretórios difundidos.
e..
sempre são omitidos, a menos que.
correspondam explicitamente ao padrão.Ksh93
Defina a
FIGNORE
variável . Se não estiver definido (a configuração padrão), o shell se comportará como se o valor fosse.*
. Para ignorar.
e..
, eles devem ser correspondidos explicitamente (o manual no ksh 93s + 2008-01-31 declara isso.
e..
sempre é ignorado, mas isso não descreve corretamente o comportamento real).Você pode incluir arquivos de ponto em um padrão , correspondendo-os explicitamente.
Para que a expansão saia vazia se o diretório estiver vazio, use a
N
opção de correspondência de padrão:~(N)@(*|.[^.]*|..?*)
ou~(N:*|.[^.]*|..?*)
.Zsh
Defina a
dot_glob
opção ..
e..
nunca são correspondidos, mesmo se o padrão corresponder.
explicitamente à liderança .Você pode incluir arquivos de ponto em um padrão específico com o
D
qualificador glob .Adicione o
N
qualificador glob para fazer a expansão sair vazia em uma pasta vazia:*(DN)
.Nota: você pode obter resultados de expansão de nome de arquivo em ordens diferentes (por exemplo,
none
seguido por.one
seguido por..two
) com base nas definições dasLC_COLLATE
,LC_ALL
eLANG
variáveis.fonte
nullglob
? Faria mais sentido abortar omv
comando (como fish, csh / tcsh, zsh (sem(N)
) do ou bash com failglob) do que executar ummv /Bar/
comando que faz pouco sentido..
e..
nunca são combinados (como em outras cascas sensíveis como zsh, peixe, pdksh e derivados), mesmo se você virar dotglob recuar depois. (GLOBIGNORE=:; shopt -u dotglob; echo .*
não será exibido.
e..
). definindo GLOBIGNORE para.:..
ou.
ou:
ter o mesmo efeito.ksh93
sempre ignorando.
e..
parece ter sido interrompido entreksh93k+
(onde funcionou) eksh93m
(onde não funciona mais). Observe que é ruim, poisksh93
terá o valor de FIGNORE do ambiente, portanto, uma variável de ambiente,FIGNORE='!(..)'
por exemplo, pode causar estragos.De
man bash
fonte
mv
reclamar que esse arquivo chamadoFoo/*
não existe. Curiosamente, seFoo
for pesquisável, mas não legível, e houver um arquivo chamado*
lá, você não receberá nenhum erro, esse arquivo será movido, mas não os outros no diretório.bash
tem umafailglob
opção para que ele se comporta mais comozsh
,fish
oucsh
/tcsh
e abortar o comando com um erro quando uma bola não pode ser expandido em vez de que o comportamento falso de deixar o glob como está.Uma maneira simples de fazer isso
bash
éMas isso também moverá diretórios.
Se você deseja mover todos os arquivos, incluindo ocultos, mas não deseja mover nenhum diretório, use um loop for e teste.
for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;
fonte
Uma maneira é usar
find
:O
-type f
restringe o comando find para encontrar arquivos. Você deve investigar o-type
,-maxdepth
, e-mindepth
opções defind
personalizar o seu comando para conta para subdiretórios. O Find tem uma página de manual longa, mas muito útil .fonte
Foo/
, não os subdiretórios e outros arquivos.Experimente o comando copy
cp
:cp -r
significa copiar recursiva, para que todas as pastas e arquivos sejam copiados.Você pode usar o comando
rm
remover para remover uma pasta:Veja mais: mova todos os arquivos de um diretório para outro .
fonte
Rsync é outra opção:
Isso funciona porque no rsync a barra final importa,
sourcedirectory/
refere-se ao conteúdo do diretório, enquantosourcedirectory
se refere ao próprio diretório.A desvantagem desse método é que o rsync apenas limpará os arquivos após a movimentação, não o diretório. Então você fica com uma árvore de diretórios vazia. Para soluções alternativas para isso, consulte:
Mover arquivos e excluir diretórios com o rsync?
Portanto, embora isso possa não ser ideal para operações de movimentação, pode ser extremamente útil para operações de cópia.
fonte
Resposta para bash / fish
Aqui está uma maneira de fazer isso usando curingas:
.[!.]* ..?*
corresponderá a todos os arquivos ocultos, exceto.
e..
.[!.]* ..?* *
corresponderá a todos os arquivos (ocultos ou não), exceto.
e..
E para responder ao exemplo específico desta pergunta, você precisa
cd foo && mv .[!.]* ..?* * ../bar
Explicação
.[!.]*
corresponde aos nomes de arquivo que começam com um ponto, seguido por qualquer caractere, exceto o ponto seguido opcionalmente por qualquer sequência. Está perto o suficiente, mas falta arquivos começando com dois pontos..foo
. Para incluir esses arquivos, adicionamos o..?*
que corresponde aos nomes dos arquivos começando com dois pontos, seguidos por qualquer caractere, opcionalmente seguido por qualquer sequência.Teste
Você pode testar esses curingas com os comandos abaixo. Eu tentei-os com sucesso em bash e peixe. Eles falham sob sh, zsh, xonsh.
fonte
Você também pode encontrar e grep com aspas para selecionar arquivos para o comando move. Passe-os para mv.
Ou seja, para arquivos ocultos
assim
Move apenas os arquivos ocultos selecionados para
Bar
:Move todos os arquivos em Foo para Bar desde o '.' no comando egrep atua como um curinga sem os colchetes.
O
^
personagem garante que a partida comece do início da linha.Alguns detalhes da
egrep
correspondência de padrões podem ser encontrados aqui .O uso de
maxdepth 1
stops find de entrar em subdiretórios.fonte
Inspirado nesta resposta :
Sem copiar os arquivos ...
Ressalvas:
--link-dest
O caminho deve ser absoluto ou relativo a DESTINATION (Bar
no exemplo)Você deve colocar
/
depois de SOURCE (Foo/
no exemplo), caso contrário, ele copiará a pasta SOURCE em vez do conteúdo dela.fonte
Acho que isso funciona bem para o bash e não há necessidade de alterar as opções do shell
EDITAR:
Então, como G-man afirmou, minha resposta original não é compatível com posix e é praticamente a mesma que a resposta de ndemou acima, com uma alteração, que é usar a expansão de chaves para criar listas de strings que são executadas. Isso significa apenas que você não precisa
cd
entrar no diretório de origem. Não é realmente uma grande mudança, mas é diferente.exemplo: digamos que você já tenha o seguinte layout.
A pergunta original mencionava apenas arquivos ocultos com um único período, mas digamos que há alguns com dois ou mais períodos no início do nome. Você pode apenas adicionar uma expressão adicional aos chavetas. Podemos então executar
Isso é expandido para o seguinte:
Agora você deve ver todos os arquivos localizados no destdir :
Você pode fazer algumas coisas bem legais com chaves no bash com ainda mais adições no 4.x. Confira bash-hackers para alguns exemplos bacanas.
fonte
..
(2) para ser compatível com POSIX , você deve usar em!
vez de^
; ou seja,{*,.[!.]*}
.cd
entrar no diretório de origem para atuar nos arquivos ou escrever os mesmos caminhos repetidamente para expressar os caminhos de todos os arquivos. Atualizarei o exemplo em breve para fornecer a qualquer leitor uma imagem melhor do que estou falando.Para distribuições mínimas de Linux, o seguinte deve funcionar. Primeiro, execute uma movimentação básica geral (que perde os arquivos ocultos). Em seguida, mova todos os arquivos ocultos (incluindo
.
oe..
que não serão realmente movidos).Notas: Se não houver conteúdo visível, o primeiro comando produzirá uma mensagem de erro. O segundo comando sempre produzirá um erro dizendo que não pode se mover
.
e..
. Como tal, basta canalizar os erros/dev/null
(como mostrado).Se você precisar disso como uma linha, basta combiná-los com um ponto e vírgula:
fonte