Lista de exclusión de mv de línea de comandos

11

¿Hay alguna manera de mv, cpo alguna operación de archivo, de modo que pueda especificar todos los archivos que no quiero que se vean afectados?

Por ejemplo, decir que tengo una carpeta con los archivos file1, file2y file3, y quiero mover file1y file2en alguna parte. En lugar de nombrar explícitamente los archivos para mover ( mv file1 file2 /path/to/destination), quiero nombrar los archivos para que no se muevan y hacer que todos los demás en la carpeta se muevan ( mv --some-switch file3 /path/to/destination)

Deslizamiento
fuente
Creo que mv file1 file2 /path/to/destinationeso no hará lo que quieres que haga
phunehehe

Respuestas:

19
  • Puede usar los patrones de globbing avanzados en algunos shells para hacer coincidir todos los archivos en un directorio, excepto los que coinciden con un patrón en particular. Por ejemplo, en ksh, bash o zsh, el comando

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    moverá todos los archivos /sourcea /destinationexcepto los archivos que coincidan *.bak. En zsh, también puede escribir /source/^*.baksi se ejecuta por primera vez setopt extended_glob, y de manera más general (una vez más setopt extended_glob) /source/*~*.bak(o /source/a*~*.bakpara todos los archivos cuyo nombre comienza con aexcepción de los .bakarchivos, etc.).

  • Zsh tiene un comando de copia / movimiento / enlace masivo que se puede utilizar, entre otros, para mover todos los archivos, excepto los que coinciden con un patrón. Por ejemplo, el siguiente comando mueve todos los archivos excepto *.bakde /sourcea targety agrega .baka su nombre en el proceso:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • Hay varios comandos llamados renameflotando. En Debian y Ubuntu, /usr/bin/renamees un script perl que mueve archivos a un nuevo nombre generado por una expresión perl. Puede excluir el cambio de nombre de los archivos al no generar un nuevo nombre si se va a excluir el archivo. Por ejemplo, el siguiente comando (usando este renameprograma en particular ) mueve todos los archivos excepto *.bakde /sourcea /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • Puede usar el findcomando para seleccionar los archivos que desea mover. Por ejemplo, el siguiente comando mueve todos los archivos normales excepto *.baken /sourceo un subdirectorio /target(tenga en cuenta que la estructura del directorio está contraída):

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    o (más eficiente si hay muchos archivos para mover)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsynces una generalización cpy scpcon reglas de inclusión / exclusión muy potentes. Por ejemplo, el siguiente comando copia todos los archivos excepto *.baken /sourceo un subdirectorio /target, respetando la estructura del directorio:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • paxes (entre otras cosas) otro cpcon esteroides. Sus reglas de exclusión no son tan poderosas como las de rsync, pero tiene la capacidad adicional de cambiar el nombre de los archivos a medida que se copian. Si cambia el nombre de un archivo a la cadena vacía, se excluye de la copia. Por ejemplo, el siguiente comando copia todos los archivos excepto *.baken /sourceo un subdirectorio en /target, y cambia el nombre de los archivos de .bakpasada.

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    El ejemplo anterior tiene el desafortunado efecto secundario de crear directorios llamados foo.bak, que se pueden evitar combinando findcon pax:

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    
Gilles 'SO- deja de ser malvado'
fuente
Increíble. Una posible corrección: creo que el findcomando debe terminar en\;
Steven D
@ Steven: Gracias, sigo olvidando que solo puedes usar +inmediatamente después {}.
Gilles 'SO- deja de ser malvado'
buena lista, gracias por eso. :-)
echox
1
qué respuesta, un gran aprobado :)
Dzung Nguyen