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 /;
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.