Quería eliminar todas las extensiones .sh, así que hice esto:
ls *.sh | xargs -I {} mv {} `basename {} .sh`
Sin embargo, no funciona, se comporta como basename
devuelve el nombre del archivo sin cambios.
¿Por qué se comporta así?
Por ejemplo, esto funciona:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
EDITAR :
Solución: la comilla simple impide la `basename ...`
evaluación por parte del shell antes de ejecutar el comando.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
majkinetor
fuente
fuente
-i
opción, pero esas opciones 'clásicas' han quedado en desuso. Por ejemplo, para usar solo una opción / línea, se recomienda la nueva página de manual POSIX-L1
. Para llamar al comportamiento anterior de-i
, la página recomienda la-I'{}'
opción.rename
, por ejemplo:rename 's/\.sh//' *.sh
. Pruebe primero con la ejecución en seco (-n
).rename
funciona muy bien y es bastante simple, pero recuerda que es muy específico de distribución. Las distribuciones basadas en RHEL y Debian proporcionan diferentesrename
comandos, por lo que hay que tener esto en cuenta al crear scripts de distribución cruzada.No estoy seguro acerca de su pregunta, ¿realmente está preguntando por qué su primera línea no funciona? ¿O está buscando un método adecuado para cambiar el nombre de todos los archivos .sh?
Suponiendo que es el método más limpio, prefiero preparar las opciones de comando antes
xargs
. Para eliminar una extensión de archivo .sh, a menudo considero este enfoque,fuente