Eu realmente não testei isso para ser à prova de falhas ou algo assim, mas você tentou simplesmente digitar este comando da Pasta A em um terminal mv */* .:?
Marty Fried
Tem certeza de que não há nomes de arquivos duplicados?
jippie
mv */* .não moverá arquivos da subpasta das subpastas.
Rahul Virpara
@jippie sim, não há nomes duplicados
Rahul Virpara
Respostas:
82
Vá para o seu Adiretório e execute
find .-mindepth 2-type f -print -exec mv {}. \;
o que significa "encontre todos os arquivos neste diretório e seus subdiretórios e execute mv com o diretório de destino. para cada arquivo encontrado para movê-los para o diretório atual.
Ele também tenta mover arquivos que já estão no diretório pai.
Rahul Virpara
virpara: agora esta edição esquece todos os arquivos nos diretórios .dot. Revisei com -mindepth 2 para suprimir avisos.
Tuminoid 6/06/12
11
Com o GNU, findvocê pode ser um pouco mais elegante e não gerar um mvprocesso para cada arquivo:find A -mindepth 2 -type f -exec mv -t A \{\} +
David Foerster
David, sua versão funciona até que você atinja o limite máximo de comprimento da linha de comando, o que não é tão difícil, considerando como o find imprime os caminhos, especialmente no caso em que você o invoca a partir de um diretório diferente de A, como no seu exemplo.
Tuminoid
9
Isso é muito perigoso. se você tiver arquivos com o mesmo nome em diferentes subpastas, substituirá todos eles com a última localização. Melhor usar mv com --backup = numerados:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
pLumo
4
Bem, você pode criar um arquivo e chamá-lo de "cutme" (para criar um arquivo chamado cutme no tipo de terminal nano cutme. Para salvá-lo, pressione CTRL + X e, em seguida, pressione ENTER.) Por exemplo, e cole o seguinte, assumindo que:
Você deseja fazer isso recursivamente (em subpastas e subpastas dessas subpastas)
Você deseja pular a movimentação do arquivo de script
Você tem permissão para mover os arquivos nessa pasta
Os arquivos podem ou não incluir espaços em seus nomes
find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;
Observe o nome cutme dentro da linha. Deve ser o mesmo que o script que você executará.
Após criar o arquivo e colar a linha acima, execute o seguinte na mesma pasta que o script:
chmod +x cutme. Isto dará a seu novo arquivo a bandeira "executável" para que você possa executá-lo como este: ./cutme.
Por que devo tentar mover os arquivos que já estão no diretório pai?
Rahul Virpara
Você executaria o script de dentro da pasta. Todo arquivo nele, se dentro de uma subpasta ou não, seria movido para a pasta pai da pasta. A pasta pai aqui é o pai em relação à localização do script. Na verdade, alterando os dois últimos pontos, você pode dizer para onde mover todos os arquivos dentro de uma pasta onde você executa o script.
mv */* .
:?mv */* .
não moverá arquivos da subpasta das subpastas.Respostas:
Vá para o seu
A
diretório e executeo que significa "encontre todos os arquivos neste diretório e seus subdiretórios e execute mv com o diretório de destino. para cada arquivo encontrado para movê-los para o diretório atual.
fonte
find
você pode ser um pouco mais elegante e não gerar ummv
processo para cada arquivo:find A -mindepth 2 -type f -exec mv -t A \{\} +
find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
Bem, você pode criar um arquivo e chamá-lo de "cutme" (para criar um arquivo chamado cutme no tipo de terminal
nano cutme
. Para salvá-lo, pressione CTRL + X e, em seguida, pressione ENTER.) Por exemplo, e cole o seguinte, assumindo que:find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;
Observe o nome cutme dentro da linha. Deve ser o mesmo que o script que você executará.
Após criar o arquivo e colar a linha acima, execute o seguinte na mesma pasta que o script:
chmod +x cutme
. Isto dará a seu novo arquivo a bandeira "executável" para que você possa executá-lo como este:./cutme
.fonte