usarse una todos siguientes renombrar puede permisos para otro mover los eliminar directorio dar cuál copiar comandos carpeta archivos archivo linux bash glob

una - permisos de archivos en linux



Mover todos los archivos excepto uno (11)

¿Qué tal si mueves todo en la carpeta y luego vuelves a mover Tux.png?

No puedo pensar en ninguna sintaxis de shell para decir "todo excepto ..." de forma directa.

¿Cómo puedo mover todos los archivos menos uno? Estoy buscando algo como:

''mv ~/Linux/Old/!Tux.png ~/Linux/New/''

donde muevo cosas viejas a cosas nuevas -carpeta excepto Tux.png . ! -sign representa una negación. ¿Hay alguna herramienta para el trabajo?


Creo que la manera más fácil de hacerlo es con palos de retroceso

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

Editar:

Use una barra diagonal inversa con ls para evitar usarlo con alias, es decir, ls en su mayoría tiene un alias como ls --color.

mv `/ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

Gracias @Arnold Roa


El siguiente no es un método 100% garantizado, y no debe intentarse en absoluto para la creación de scripts. Pero algunas veces es lo suficientemente bueno para un uso de shell interactivo e inmediato. Un archivo de archivo global como

[abc]*

(que coincidirá con todos los archivos con nombres que comienzan con a, bo c) se puede negar al insertar primero un carácter "^", es decir,

[^abc]*

A veces uso esto para no coincidir con el directorio "perdido + encontrado", como por ejemplo:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

Por supuesto, si hay otros archivos que comienzan con l, debo procesarlos luego.


Encuentro que esto es un poco más seguro y más fácil de usar para movimientos simples que excluyen ciertos archivos o directorios.

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET


Me gustaría ir con la forma tradicional de find & xargs:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | xargs -0 mv -t ~/Linux/New

-maxdepth 1 hace que no busque de forma recursiva. Si solo te importan los archivos, puedes decir -type f . -mindepth 1 hace que no incluya la ruta ~/Linux/Old en el resultado. Funciona con cualquier nombre de archivo, incluso con aquellos que contienen líneas nuevas incorporadas.

Un comentario señala que la opción mv -t es probablemente una extensión de GNU. Para sistemas que no lo tienen

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png / -exec mv ''{}'' ~/Linux/New /;


Para bash, la respuesta es correcta. Aquí está la sintaxis zsh (mi shell de elección):

mv ~/Linux/Old/^Tux.png ~/Linux/New/

Requiere la opción de shell EXTENDED_GLOB para establecerse.


Pon lo siguiente en tu .bashrc

shopt -s extglob

Se extiende expresiones regulares. A continuación, puede mover todos los archivos, excepto uno

mv !(fileOne) ~/path/newFolder

Excepciones en relación con otros comandos

Tenga en cuenta que, al copiar directorios, el forward-flash no se puede usar en el nombre como se notó en el hilo. ¿Por qué extglob excepto break, excepto condición? :

cp -r !(Backups.backupdb) /home/masi/Documents/

entonces Backups.backupdb/ es incorrecto aquí antes de la negación y no lo usaría ni en directorios en movimiento debido al riesgo de usarlo incorrectamente y luego a otros comandos y otras posibles excepciones.


Si usa bash y tiene extglob opción de shell extglob (que generalmente es el caso):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/


Una manera rápida sería modificar el nombre de archivo tux para que su comando de movimiento no coincida.

Por ejemplo:

mv Tux.png .Tux.png mv * ~/somefolder mv .Tux.png Tux.png


ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/''


mv `find Linux/Old ''!'' -type d | fgrep -v Tux.png` Linux/New

El comando find lista todos los archivos normales y el comando fgrep filtra cualquier Tux.png. Los backticks le dicen a mv que mueva la lista de archivos resultante.