Como condensar subdiretórios

4

Eu tenho um diretório com muitos subdiretórios. Todos esses subdiretórios contêm arquivos, cada um com nomes exclusivos. Eu quero pegar todos os arquivos de todos os subdiretórios e movê-los todos para um diretório.

Existem algumas centenas de subdiretórios, então eu não gostaria de fazer isso manualmente. Como eu iria escrever um script de shell para fazer isso? Estou usando bash.

    
por jgp 13.08.2013 / 01:08

3 respostas

6

find é a solução:

find /srcpath -type f -exec mv {} /dstpath \;

ou melhor, se o seu mv tiver a opção -t destination-dir :

find /srcpath -type f -exec mv -t /dstpath {} +
    
por 13.08.2013 / 01:20
3

A maneira simples, se houver um único nível de subdiretórios:

cd source_directory
mv -- */* /path/to/target/directory

Se você deseja mover os arquivos para o diretório pai, isso é mv -- */* . . Observe que os arquivos ou diretórios cujo nome começa com . ("arquivos de ponto") são excluídos. Para incluí-los, no bash, execute shopt -s dotglob primeiro. Em zsh, execute setopt glob_dots primeiro.

Se você quiser mover arquivos de subdiretórios e assim por diante de forma recursiva, com zsh :

cd source_directory
mv -- */**/*(^/) .

Se você tentar executar o comando mv e receber um erro como "linha de comando longa demais", será necessário desmembrá-lo. A maneira mais simples é usar find . Com ferramentas GNU (Linux não integrado e Cygwin):

find source_directory -mindepth 2 ! -type d \
  -exec mv -t /path/to/target/directory -- {} +
    
por 13.08.2013 / 01:57
2
#! /bin/sh

# set your output directory here
outdir=./Outdir 

# get a list of all the files (-type f)
# in subdirectories (-mindepth 1)
# who do not match the outdir  (-path $outdir -prune)
# and step through and execute a move
find . -mindepth 1 -path $outdir -prune -o -type f -exec mv '{}' $outdir \;

Isso permitirá que você pesquise a partir do diretório de trabalho atual, todos os subdiretórios, e mova os arquivos para um subdiretório no mesmo diretório de trabalho ($ outdir) - observe continuando ./ no caminho para fazer o -prune funcionar corretamente.

    
por 13.08.2013 / 01:34