Estoy intentando mover archivos desde Terminal pero sólo los de los resultados de un grep
consulta.
ls -l | grep -i s02 | mv
¿Cuál es la mejor manera de completar el comando anterior?
Estoy intentando mover archivos desde Terminal pero sólo los de los resultados de un grep
consulta.
ls -l | grep -i s02 | mv
¿Cuál es la mejor manera de completar el comando anterior?
Para ello, basta con ejecutar
cd directory/containing/the/files
mv *[sS]02* /path/to/target/
Para operaciones más complejas también existe la opción de utilizar find
para encontrar todos los archivos relevantes. El ejemplo de su pregunta también podría escribirse como
cd directory/containing/the/files
find . -type f -maxdepth 1 -iname '*s02*' -exec mv {} /path/to/target/directory/ \;
Merece la pena echar un vistazo a man find
para ver qué otras opciones están disponibles.
Por ejemplo con bash. Dados los archivos siguientes
$ ls -1
test1
test2
test3
1) Para evitar sorpresas, veamos primero los comandos
$ for i in test*; do echo mv $i $i.ext; done
mv test1 test1.ext
mv test2 test2.ext
mv test3 test3.ext
y ejecutar los comandos si esto es lo que queremos
$ for i in test*; do mv $i $i.ext; done
$ ls -1
test1.ext
test2.ext
test3.ext
Adapta el camino a tus necesidades.
2) Es posible utilizar sed y xargs . Vamos a probarlo primero
$ ls -1 test* | sed 'p;s/test/test_/' | xargs -n2 printf "%s %s\n"
test2 test_2
test1 test_1
test3 test_3
y ejecutar los comandos si esto es lo que queremos
$ ls -1 test* | sed 'p;s/test/test_/' | xargs -n2 mv
$ ls -1
test_1
test_2
test_3
Espacios en el nombre del archivo
Estos scripts no funcionarán como se espera si los nombres de los archivos incluyen espacios. En Unix el espacio se utiliza como separador. Por ejemplo, con los archivos
$ ls -1
test 1
test 2
test 3
está claro que los comandos siguientes no pueden funcionar como se espera
$ for i in test*; do echo mv $i $i.ext; done
mv test 1 test 1.ext
mv test 2 test 2.ext
mv test 3 test 3.ext
La solución es excluir el espacio de la lista de separadores
$ IFS="`printf '\n\t'`"
y lo anteponemos a los comandos que deben procesar los nombres de los archivos con espacios. El comando siguiente
$ IFS="`printf '\n\t'`"; for i in test*; do mv $i $i.ext; done
funciona como se espera
$ ls -1
test 1.ext
test 2.ext
test 3.ext
La siguiente opción es la cita de los argumentos
for i in test*; do mv "$i" "$i.ext"; done
De esta manera es posible utilizar la rica variedad de filtros de Unix y evitar la limitación a la construcción "find ... -exec ... {}". Para otras limitaciones vea las notas bajo la línea.
Notas sobre MacOS
1) Cita de opengroup.org - Norma de producto: Comandos y utilidades V4
1.4.21 sh
Pregunta 31: ¿Se ignora la variable de entorno IFS cuando se invoca el shell?
Respuesta: Sí
Justificación: La especificación permite que el comando sh ignore la configuración de la variable de entorno IFS en la invocación. La configuración de esta variable se ha utilizado para violar la seguridad en sistemas que utilizan el shell para interpretar una llamada a las interfaces system() y execvp().
Referencia: Norma Técnica, Shell y Utilidades, Edición 6, Capítulo 4, Utilidades, sh, VARIABLES DE ENTORNO, IFS.
2) Cita de developer.apple.com - Entrada y salida de Shell
Puede modificar el comportamiento del comando de lectura modificando la variable del shell IFS (abreviatura de separadores de campo internos). El comportamiento por defecto es dividir las entradas siempre que haya un espacio, un tabulador o una nueva línea. Al cambiar esta variable, ...
3) Cita de developer.apple.com - Declaraciones de control básicas - Estándar para bucles
En el siguiente ejemplo, la lista es *.JPG ...
#!/bin/sh
for i in *.JPG ; do
mv "$i" "$(echo $i | sed 's/\.JPG$/.x/')"
mv "$(echo $i | sed 's/\.JPG$/.x/')" "$(echo $i | sed 's/\.JPG$/.jpg/')"
done
Estos scripts pueden no funcionar como se espera si hay caracteres especiales en el nombre del archivo. Sustituya primero dichos caracteres. Véase Cómo eliminar el carácter especial . Hay docenas de artículos sobre cómo renombrar archivos con espacios y otros caracteres que dan problemas, por ejemplo. Los nombres de archivos con espacios rompen el bucle for, el comando find . Es una buena idea deshacerse de estos caracteres y traducir los nombres de los archivos al formato que prefieras (por ejemplo rename-file ) antes de procesarlos en *nix. Véase Corregir los nombres de los archivos de Unix/Linux/POSIX .
AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.