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 {} +
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.
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 {} +
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 -- {} +
#! /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.
Tags directory shell-script