¿Cómo puedo mover todos los archivos excepto uno? Estoy buscando algo como:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
donde muevo cosas viejas a carpetas nuevas, excepto Tux.png
. ! -sign representa una negación. ¿Hay alguna herramienta para el trabajo?
Ponga lo siguiente en su .bashrc
Extiende expresiones regulares. Luego puede mover todos los archivos excepto uno por
Excepciones en relación con otros comandos.
Tenga en cuenta que, al copiar directorios, el flash de avance no se puede usar en el nombre como se observa en el hilo ¿Por qué extglob excepto romper excepto condición? :
así que
Backups.backupdb/
está mal aquí antes de la negación y no lo usaría ni para mover directorios debido al riesgo de usar mal, luego globos con otros comandos y otras posibles excepciones.fuente
mv !(arc*) archive_190629b
Me gustaría seguir la forma tradicional de encontrar y xargs:
-maxdepth 1
hace que no busque de forma recursiva. Si solo te interesan los archivos, puedes decir-type f
.-mindepth 1
hace que no incluya la~/Linux/Old
ruta en sí misma en el resultado. Funciona con cualquier nombre de archivo, incluso con aquellos que contienen nuevas líneas incrustadas.Un comentario señala que la
-t
opción mv es probablemente una extensión GNU. Para sistemas que no lo tienenfuente
Una forma rápida sería modificar el nombre de archivo tux para que su comando de movimiento no coincida.
Por ejemplo:
fuente
Creo que la forma más fácil de hacerlo es con backticks
Editar:
Utilice la barra invertida con ls en su lugar para evitar usarlo con alias, es decir, principalmente ls tiene el alias como ls --color.
Gracias @Arnold Roa
fuente
grep -v
allí?Para bash, la respuesta sth es correcta. Aquí está la sintaxis de zsh (mi shell de elección):
Requiere
EXTENDED_GLOB
que se establezca la opción de shell.fuente
Creo que esto es un poco más seguro y más fácil de usar para movimientos simples que excluyen ciertos archivos o directorios.
fuente
-l
opciónls
incluirá una gran cantidad de información irrelevante en la línea de comando y resultará en la falla del comando mv.El siguiente no es un método 100% garantizado y no debe intentarse en absoluto para la creación de secuencias de comandos. Pero algunas veces es lo suficientemente bueno para un uso rápido de shell interactivo. Un archivo de archivo glob como
(que coincidirá con todos los archivos con nombres que comienzan con a, b o c) se puede negar insertando un carácter "^" primero, es decir
A veces uso esto para no coincidir con el directorio "perdido + encontrado", como por ejemplo:
Por supuesto, si hay otros archivos que comienzan con l, tengo que procesarlos después.
fuente
El comando find enumera 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.
fuente
¿Qué tal si mueve todo en la carpeta y luego simplemente mueve Tux.png de regreso?
No se me ocurre ninguna sintaxis de shell que diga "todo excepto ..." de manera improvisada.
fuente
fuente
ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/
funciona en su lugar.Qué tal si:
Sin embargo, debes estar en la carpeta.
fuente
Uno puede omitir grep así:
fuente
Esto podría ser más simple y fácil de recordar y funciona para mí.
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination
fuente