Script de shell para mover todos os arquivos das subpastas para a pasta pai

48

Eu tenho várias pastas na pasta A. Eu quero mover arquivos de todas essas pastas para A.

Ou

Quero cortar todos os arquivos das pastas filho e colá-los na pasta pai.

Como fazer isso?

Rahul Virpara
fonte
11
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.

Tuminoide
fonte
11
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:

  1. Você deseja fazer isso recursivamente (em subpastas e subpastas dessas subpastas)
  2. Você deseja pular a movimentação do arquivo de script
  3. Você tem permissão para mover os arquivos nessa pasta
  4. 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.

Luis Alvarado
fonte
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.
Luis Alvarado