Tengo un directorio que estoy tratando de limpiar que contiene archivos y subdirectorios. Lo que intento hacer es simple: mover todos los archivos a otro directorio, pero dejar todos los subdirectorios como están.
Estoy pensando algo como:
mv [*_but_no_dirs] ./other_directory
Parece que debería haber una manera simple de hacer esto con comodines *
y expresiones regulares ...
Alguien tiene ideas?
mv **/*(.) ./other_directory
; sin embargo , con bash necesitaría recurrir a comandos externos comofind
.Respuestas:
Regex no está involucrado aquí. Los comodines en bash (como la mayoría de los otros shells) solo coinciden con los archivos según los nombres de los archivos, no según el tipo de archivo u otras características. Hay una manera de hacer coincidir por tipo: agregar
/
al final del patrón hace que solo coincida con directorios o enlaces simbólicos a directorios. De esta manera, puede mover directorios, luego mover lo que queda y mover directorios hacia atrás, lo cual es engorroso pero funciona.Una forma estándar de hacer coincidir archivos por tipo es llamar
find
.En zsh, puede usar calificadores globales para unir archivos por tipo. El
.
calificador coincide con los archivos normales; use^/
para hacer coincidir todos los no directorios, o-^/
también para incluir enlaces simbólicos a directorios.En cualquier shell, puedes simplemente hacer un bucle.
fuente
Podrías usar algo como
Primero usamos
find
para mirar solo dentro del directorio actual, luego ignoramos los directorios usando! -type d
finalmente ejecutamossh
y movemos todo al directorio de destino. Puede intentar{} +
al final, que será más rápido.fuente
-exec sh -c 'mv "$@" MYDIR' _ {} \;
lugar de-exec mv {} MYDIR \;
? ¿Solo para obtener algo que se pueda simplificar cambiando el\;
a+
? Puedes hacerlo con el-exec mv -t MYDIR {} +
formulario.-t
bandera. También expliqué en la respuesta que+
es más rápido pero no todas lasfind
versiones lo admiten. Por lo tanto, el código anterior es bastante compatible con cualquierafind
o shell que se utiliza.find
o shell que se utiliza". Es cierto, pero también lo esfind … -exec mv {} MYDIR \;
, y utiliza menos recursos que… -exec sh -c 'mv "$@" MYDIR' _ {} \;
.Es potencialmente un poco peligroso pero
Como cp y rm no funcionarán en directorios sin el modificador -r.
fuente
Sugeriría simplemente hacer
mv *.* destination/
con el destino / ser la carpeta a la que se está moviendo.fuente
*.*
lo que moverá algunos directorios y dejará algunos archivos, que no es lo que el autor de la pregunta quería.fuente