¿Cómo mover varios archivos en diferentes directorios a un directorio único?

¿Cómo mover varios archivos en diferentes directorios a un directorio único?

Tengo 220 directorios, cada uno con 2 archivos dentro. todos los archivos tienen la misma terminación (*.fq.gz). Quiero mover todos estos archivos a un directorio único.

Creo que podría hacer eso con un bucle de shell, pero no tengo idea de cómo hacerlo...

Respuesta1

Esto es algo que uso cuando no necesito tener mucho cuidado.

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

A menos que me haya perdido algo.

Respuesta2

Tienes razón. Puedes realizar esta tarea con dos bucles for. Uno dentro del otro. Crearemos un script bash para hacer precisamente eso. Veamos cómo quedaría:

#!/bin/bash

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

Si desea tener un script más rápido, simplemente elimine el eco del script. Hice esto para facilitar el seguimiento de su progreso.

Simplemente cree un archivo y copie estos comandos en él. Después de eso, otorgue permiso de ejecución chmod +x scriptfiley ejecútelo ./scriptfileen el directorio principal donde se encuentran los otros directorios. No olvide reemplazar targetdir y scriptfile con su directorio de destino y el nombre del archivo de script.

Si tiene más archivos en sus directorios, simplemente reemplácelos *con *.fq.gzen el for filebucle y se repetirá solo a través de sus 2 archivos.

¡¡¡Advertencia!!! No cree su directorio de destino dentro del directorio principal porque también se repetirá dentro de él.


Editar: como sugirió @steeldriver, puede eliminar for dircomandos y simplemente usar for filecomandos con */*.fq.gzpara tener un bucle más rápido. Decidí mantenerlos para un mejor seguimiento de lo que sucede dentro de los directorios.

Editar: mientras investigaba un poco sobre las páginas man y web de los comandos find y xarg respondidas por @waltinator, lo encontré más conveniente, más rápido y seguro. Incluso encontré una alternativa a xarg usando la opción -exec del comando buscar como find . -type f -name '*.fq.gz' -exec mv --backup=numbered --target-directory=$dest {} \;.

Respuesta3

Cuando se trata de muchos archivos, o archivos con nombres divertidos, findcuáles xargsson las herramientas a utilizar. Lee man find;man xargsy haz 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

Una vez que esté satisfecho con los resultados, reemplace " echo mv" con solo " mv".

Para excluir el $destdirectorio que se encuentra en dificultad actual, utilice --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

Respuesta4

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

también podrías agregar

sudo apt install krename

vaya a las herramientas del directorio de origen superior, busque o haga clic en crtl+s para editar el cuadro de lista, seleccione todos los archivos, copie a otro panel o f5, otro panel es la otra pestaña que es el destino de origen

información relacionada