Como mover vários arquivos em diretórios diferentes para um diretório único?

Como mover vários arquivos em diretórios diferentes para um diretório único?

Tenho 220 diretórios, cada um com 2 arquivos dentro. todos os arquivos têm a mesma terminação (*.fq.gz). Quero mover todos esses arquivos para um diretório exclusivo.

Acho que poderia fazer isso com um shell loop, mas não tenho ideia de como fazer isso...

Responder1

Isso é algo que eu uso quando não preciso ser extremamente cuidadoso

mkdir unique_dir && mv */*.fq.gz unique_dir/

A menos que eu tenha perdido alguma coisa.

Responder2

Você está certo. Você pode realizar esta tarefa com dois loops for. Um dentro do outro. Criaremos um script bash para fazer exatamente isso. Vamos ver como ficaria:

#!/bin/bash

for dir in */; do
  echo "$dir"
  cd "$dir"
  for file in *; do
    echo "moving $file" 
    mv $file ~/targetdir    
  done
  cd ..
done

Se você quiser um script mais rápido, basta remover o eco do script. Fiz isso para facilitar o acompanhamento de seu progresso.

Basta criar um arquivo e copiar esses comandos para ele. Depois disso, dê permissão de execução chmod +x scriptfilee execute-o ./scriptfileno diretório principal onde os demais diretórios estão localizados. Não se esqueça de substituir targetdir e scriptfile pelo diretório de destino e nome do arquivo de script.

Se você tiver mais arquivos em seus diretórios, basta substituir *por *.fq.gzno for fileloop e ele irá iterar apenas pelos seus 2 arquivos.

Aviso!!! Não crie seu diretório de destino dentro do diretório principal porque ele também irá iterar dentro dele.


Editar: como sugerido por @steeldriver, você pode remover for dircomandos e apenas usar for filecomandos */*.fq.gzpara ter um loop mais rápido. Decidi mantê-los para melhor rastrear o que está acontecendo nos diretórios.

Editar: ao fazer algumas pesquisas nas páginas man e web dos comandos find e xarg respondidos por @waltinator, achei mais conveniente, rápido e seguro. Eu até encontrei uma alternativa ao xarg usando a opção -exec do comando find, como find . -type f -name '*.fq.gz' -exec mv --backup=numbered --target-directory=$dest {} \;.

Responder3

Ao lidar com muitos arquivos, ou arquivos com nomes engraçados, findsão xargsas ferramentas a serem usadas. Leia man find;man xargse faça algo como:

dest=../destination # must be outside this directory tree
mkdir $dest

find . -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

Quando estiver satisfeito com os resultados, substitua " echo mv" por apenas " mv".

Para excluir a $destdificuldade do diretório atual, use --prune:

find . -type d -name "$dest" -prune -o -type f -name '*.fq.gz' -print0 |\
   xargs -0 --no-run-if-empty echo mv --backup=numbered --target-directory=$dest

Responder4

krusader can search files and save to a custom tab then you can select all of those (or filter the list) and move them to the destination

sudo apt install krusader

você também pode adicionar

sudo apt install krename

vá para as ferramentas do diretório de origem superior, pesquise ou crtl + s clique em feed para a caixa de listagem editar selecione todos os arquivos, copie para outro painel ou f5 outro painel sendo a outra guia que é o destino de origem

informação relacionada