Estou tentando coletar todos os arquivos no diretório atual e todos os subdiretórios em um diretório. Estou tentando algo como o seguinte
find -type f -exec mv {} collection/{} \;
o comando acima não funcionará porque o segundo {}
fornece o caminho completo, como posso coletar todos os arquivos?
command-line
find
Coelhinho
fonte
fonte
-maxdepth 1
ajudasse.find -type f -print0|xargs -0r mv -it colection/
Em vez de usar
find
(que faz o trabalho bem), você também pode usar o shell para esse fim.Digamos que você queira todos os arquivos de $ PWD a $ DEST. A tentativa natural seria:
Como é que isso funciona? A expressão "$ PWD / *" se expande para os nomes de todos os arquivos nesse diretório. Esse recurso de shell é chamado de "globbing". O último argumento de
mv
é o diretório de destino. Se você tiver muitos arquivos, isso não funcionará porque o comprimento da linha de comando é limitado.Mas a solução tem o problema de omitir arquivos de ponto - ou arquivos "ocultos", arquivos e diretórios cujo nome começa com um ".". Para resolver isso, você deve dizer ao seu shell para incluir arquivos de ponto ao globbing. Para fazer isso, use
ao usar
bash
(e você provavelmente usa, abash
menos que tenha alterado o padrão). Nesse shell, o comando acima também funcionará para arquivos de ponto.Como um aparte, em
zsh
, você tem a opção de escolher isso caso a caso. Para fazer isso, coloqueno seu
.zshrc
. Então você pode usarpara mover todos os arquivos, incluindo arquivos de ponto. (O "D" tem o efeito de ativar temporariamente a opção "GLOB_DOTS").
Agora, a pergunta original era mover todos os arquivos regulares (não diretórios) de todos os subdiretórios e seus subdiretórios para um único diretório. Isso pode ser realizado com
zsh
:Aqui, a expressão
**/*
faz o globber descer recursivamente para subdiretórios. OsD
meios "também selecionam arquivos de ponto"; os.
meios "somente selecionam arquivos regulares, não diretórios".fonte
find -type f -exec mv -t collection/ {} +
. Consulte a página do manual sobre como isso funciona.