Mover archivos solo linux

Mover archivos solo linux

Tengo una ruta/participante/datos donde todos los archivos están en el directorio de datos. Sin embargo, quiero que la estructura del directorio sea /participante/datos/subdirectorio, y que el subdirectorio contenga todos los archivos. Tiene que ser así para que pase una tubería.

Mi primer pensamiento fue

mkdir /participante/datos/subdirectorio/

mv /participante/datos/*.* /participante/datos/subdirectorio/

Sin embargo, los archivos no tienen una extensión de archivo, por lo que usar *.* no funcionará. ¿Alguna sugerencia sobre cómo hacer esto?

Respuesta1

Simplemente mueve todo:

mv /participant/data/* /participant/data/subdirectory/

Esto se quejará de que no puede moverse subdirectorydentro de sí mismo, pero aun así moverá todo lo demás a ese subdirectorio de la manera que deseaba.

Bash shopt -s extglobagrega algunos caracteres comodín adicionales, como para !(xy|z)que coincidan con todo como* excepto xyo z:

shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/

(Zsh probablemente tenga comodines aún más extendidos que solo pueden hacer coincidir archivos).

Si tiene más subdirectorios y no desea tocarlos, se pueden usar herramientas como findo fdpara operar solo en elementos específicos, en este caso solo archivos:

find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;

Esto sería un poco más eficiente usando mv -ty -exec +:

find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +

El ejemplo anterior (más lento) también se puede escribir como un forbucle de shell:

for x in /participant/data/*; do
    if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done

Respuesta2

Puede utilizar *en lugar de *.*para incluir todos los archivos independientemente del nombre del archivo.

Pero esto también incluiría directorios, incluidos subdirectory, por lo que debe excluirlos al mover los archivos.

Esto es posible con las funciones ampliadas de coincidencia de patrones. Primero tienes que habilitarlos (para la sesión actual):

$ shopt -s extglob

Luego puede abordar todos los archivos excepto uno usandopath/!(excludedFile)

Implementado en mv:

$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/

Hay más opciones para mover todos los archivos excepto uno:https://www.baeldung.com/linux/move-all-files-except-one

Respuesta3

Lo más fácil para la situación que usted describe es:

cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory

El * coincidirá con todas las entradas del directorio que no estén ocultas, es decir, todas las que no comiencen con un punto. Como comenzamos temporalmente el nombre del subdirectorio con un punto, no coincide y se moverán todas las entradas de datos. Ahora, si tiene algunas entradas que no desea mover, como otros subdirectorios, tendrá que usar uno de los métodos más complejos, como los de la respuesta detallada del usuario1686.

información relacionada