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 scriptfile
e execute-o ./scriptfile
no 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.gz
no for file
loop 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 dir
comandos e apenas usar for file
comandos */*.fq.gz
para 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, find
são xargs
as ferramentas a serem usadas. Leia man find;man xargs
e 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 $dest
dificuldade 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