Necesito un comando para cambiar el nombre de todos los archivos en el directorio de trabajo actual, de manera que el nuevo nombre de archivo sea el mismo que el anterior, pero que incluya un sufijo correspondiente al número de líneas de los archivos originales (por ejemplo, si el archivo f
tiene 10 líneas, entonces debe cambiarse el nombre a f_10
).
Aquí está mi intento (que no funciona):
linenum=$(wc -l); find * -type f | grep -v sh | rename 's/^/ec/'*
bash
batch-rename
Martin Yeboah
fuente
fuente
Respuestas:
Qué tal si:
Por ejemplo:
Si desea mantener las extensiones (si están presentes), use esto en su lugar:
fuente
_
. En cuanto al guión, ¿qué guión? Eso debe ejecutarse desde la línea de comandos, no hay necesidad de un script. Si solo desea que coincida con algunos archivos, cambiein *
a, por ejemplo,in *txt
o algo así.wc -l < $f
lugar del grep sería más fácil de entender (y tal vez mejor para realizar, pero no lo he comprobado).wc
, quería mostrar un enfoque diferente. Pero está bien, lo suficientemente justo.Puedes probar este liner:
Esto encontrará todos los archivos en el directorio de trabajo actual (
find . -maxdepth 1 -type f
)Luego, estamos ejecutando una instancia de shell sobre los archivos encontrados para cambiar el nombre de los archivos para agregar el número de líneas.
Ejemplo:
fuente
Otra forma que conserva la extensión (si está presente) usando
rename
:Si el resultado es el esperado, elimine la
-n
opción:fuente
rename
genial =) +1(\.?[^\.]+)
.(\.?[^\.]+)
, no es aceptable, ya sea porque va a coincidir sólo hasta el segundo punto y no coincidirá con un nombre de archivo con puntos consecutivos o terminando con un punto independientemente. No es una solución fácil, difícil, la única forma parece hacer dos sustituciones..
clases de personajes en su interior.Utilizando
find
:Ejemplo
fuente
-name "*"
? ¿Restos de las pruebas? ;)Sólo por diversión y risitas con una solución
rename
. Dado querename
es una herramienta de Perl que acepta una cadena arbitraria que se evalúa, puede hacer todo tipo de travesuras. Una solución que parece funcionar es la siguiente:fuente
El siguiente script cubre múltiples casos: el punto único y la extensión (file.txt), múltiples puntos y extensiones (file.1.txt), puntos consecutivos (file..foobar.txt) y puntos en el nombre del archivo (archivo. O archivo..).
La secuencia de comandos
Guión en acción
Tenga en cuenta que no hay líneas en el archivo. y archivo .., por lo tanto, el recuento de líneas es 0
Un agradecimiento especial a terdon y Helio por revisar el guión y las ediciones sugeridas
fuente
Otra manera bash, desarrollada con @Helio en el chat :
El tipo monocular de aspecto extraño con una segunda cabeza atrofiada (
(.*)(\.[^.]+)$
) debe coincidir solo con las extensiones adecuadas (.foo
, no..
). Si no hay extensión, laBASH_REMATCH
matriz estará vacía. Podemos aprovechar esto usando un valor predeterminado para el nombre del archivo${BASH_REMATCH[1]:-$file}
, y simplemente usando la extensión como está.Para manejar archivos de puntos, puede usar
find
, como lo sugieren terdon y Helio .fuente