Tengo un montón de archivos .zip en varios directorios:
Fol1/Fol2
Fol3
Fol4/Fol5
¿Cómo los movería a una carpeta base común?
command-line
files
find
recursive
InquilineKea
fuente
fuente

Respuestas:
Vaya al directorio de nivel superior del árbol que contiene los archivos zip (
cd …), luego ejecuteEsto funciona fuera de la caja en zsh. Si su shell es bash,
shopt -s globstarprimero deberá ejecutarlo (puede y debe poner este comando en su~/.bashrc). Si su shell es ksh,set -o globstarprimero deberá ejecutarlo (ponerlo en su~/.kshrc).Alternativamente, use
find, que funciona en todas partes sin una preparación especial, pero es más complicado:Si desea eliminar directorios vacíos después, en zsh:
En bash o ksh:
y repita siempre que haya directorios vacíos para eliminar. Alternativamente, en cualquier caparazón
fuente
findcomando anterior funcionó en bash, pero tuvo que cambiar afind . -nameetc. para que funcione..está implícito para GNU find pero no para otros, lo he agregado explícitamente.Si solo desea mover los
.ziparchivos, puede hacer algo comofuente
Si usa bash versión 4 o superior o zsh , también puede usar globbing recursivo:
Esto moverá SOLAMENTE los archivos y no sus rutas relativas, por lo que pueden ocurrir colisiones.
fuente
Este es seguro al mover datos y sin errores, lo que es compatible con la mayoría de las distribuciones independientemente de las versiones. Este comando escaneará subdirectorios y luego se moverá o copiará a su nuevo directorio de destino.
*.flaca algo como*.zipen su caso. O*.docsimplemente cualquier extensión funciona.mves el comando para mover archivos, o puede usarcppara copiar datos en lugar de moverlos../flac/es el directorio de destino al que quiero mover todos los archivos FLAC. También puedes darle un camino completo como/home/myid/flac/Ejemplo completo. (en este caso, hay muchos subdirectorios con el nombre del artista de música en
/home/myid/Music/y luego los archivos FLAC están en diferentes niveles de subdirectorios. Dado que no necesito carpetas de artistas pero quiero tener todos los archivos FLAC en un directorio en/home/myid/Music/flac/Luego mostrará todos los archivos FLAC.
fuente
;hacer?Como un hack bash, podrías usar el poder de
tar:Esto tiene la ventaja de que no depende de las extensiones de archivo, ya que utiliza el
filecomando para elegir los archivos a mover y conserva la estructura del directorio, pero no funciona con rutas que contienen espacios.La final
rmestá ahí solo para eliminar los archivos originales (porque @InquilineKea dice que no le importa la carpeta original en el comentario).Por supuesto, esto es particularmente adecuado si las carpetas de origen / destino / están en discos diferentes. De lo contrario, las otras soluciones propuestas son más eficientes (incluso si se basan en convenciones de nomenclatura, en lugar del
filecontenido).fuente
Suponiendo que tiene las versiones GNU de find y mv, lo siguiente será más eficiente que las respuestas basadas en find existentes:
Usar un
+al final de find -exec significa que se pasará una lista de archivos al comando mv, en lugar de ejecutar un comando mv por archivo encontrado. Sin embargo, una limitación de esto es que solo puede colocar el '{}' al final del comando, lo que requiere el uso de la opción mv --target-directory, y que yo sepa, eso es un GNU-ismo.fuente