Estoy intentando mover mis archivos del directorio actual a otro directorio. El problema que tengo es que varios archivos tienen un nombre con caracteres especiales como space, ü, &, (, ...
. ¿Cómo puedo mover todos mis archivos usando un comando como: ls | grep mp4 | xargs -i mv {} mp4
, donde {}
se supone que es el nombre del archivo actual y mp4 el destino para colocar todos mis archivos? Probé el comando pero muestra errores. ¿Puedes ayudarme?
Respuesta1
Esta es exactamente la situaciónno quieres usarls
O xargs
con la configuración predeterminada, dividirá la entrada en espacios y manejará especialmente las comillas y las barras invertidas. Necesitaría usarlo -0
para separar la entrada en bytes nulos o -d'\n'
separar las nuevas líneas (GNU xargs) para desactivar ese comportamiento.
Como todos los archivos están en el mismo directorio, puedes usar el shell:
mv *mp4* mp4/
O mv *.mp4 mp4/
si solo te refieres a archivos que tienen mp4
como extensión. El primero advertiría sobre el traslado mp4
a mp4
.)
Si los archivos no estuvieran en el mismo directorio, necesitaría usar la doble estrella ( zsh
- habilitada de forma predeterminada o ksh
con set -o globstar
o bash
con shopt -s globstar
):
mv **/*mp4* mp4/
ofind
find . -type f -name "*mp*" -exec mv {} mp4/ \;
Respuesta2
El comando:
ls | grep mp4 | xargs -i mv {} mp4
En la mayoría de los casos puede ser reemplazado por el más simple y robusto:
mv *mp4* mp4
Puede ignorar la advertencia acerca de que el directorio mp4 no se puede mover dentro de sí mismo.
Tenga en cuenta que esta secuencia de comandos, como la suya, mueve todos los archivos que tienen " mp4
" en cualquier parte de su nombre (por ejemplo: mp4list.txt
, lamp4.jpg
). Si realmente desea mover sólo archivos con la extensión " .mp4
", puede utilizar:
mv *.mp4 mp4
Eso evitaría que mp4
se produjera la situación que provoca el mensaje de error sobre el directorio.
Si la cantidad de archivos mp4 es enorme e impide que funcione el comando anterior, puede usar GNU find
para lograr lo mismo:
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
o
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +