Sem find
shopt -s globstar
mv -nv **/*.mp3 /path/to/common/directory
Eu tenho um diretório chamado music, que tem muitos álbuns e faixas separadas. Alguns deles estão em subdiretórios. O que eu quero é remover essas pastas e misturar todas as faixas no diretório de músicas sem separações.
Será difícil fazer isso manualmente, por isso estou procurando algumas bash comando.
find
shopt -s globstar
mv -nv **/*.mp3 /path/to/common/directory
find . -mindepth 1 -type f -exec mv -i "{}" /common/path \;
find . -mindepth 1 -d -type d -exec rmdir "{}" \;
Isso moverá todas as músicas do diretório atual para /common/path
e o segundo excluirá todos os diretórios. Então você pode mover todas as suas coisas de volta para o diretório original.
Além disso, isso perguntará se você deseja substituir arquivos com o mesmo nome.
find /path/to/music/ -type f -execdir mv -n "{}" /path/to/sharedmusic/ \;
Os arquivos com nomes duplicados não serão movidos, mas deixados em seus locais originais.
Você pode completar um achado para todos os arquivos nos subdiretórios e então fazer com que o comando find execute a movimentação para o diretório atual.
um exemplo disso é encontrado nesta resposta abaixo. link
Resposta entre as respostas: link
xargs
is commonly used for this, andmv
has a-t
option to facilitate that.find ./ -name '*article*' | xargs mv -t ../backup
If your
find
supports-exec ... \+
you could equivalently dofind ./ -name '*article*' -exec mv -t ../backup {} \+
The
-t
option is probably a GNU extension. It's of course possible to roll your own, maybe something likefind ./ -name '*article*' -exec sh -c 'mv "$@" "$0"' ../backup {} \+
where we shamelessly abuse the convenient fact that the first argument after
sh -c 'commands'
ends up as the "script name" parameter in$0
so that we don't even need toshift
it.