2011-07-06 27 views
10

necesito para calcular suma md5 de una cadena (pathfile) por línea en mi volcado ls, directory_listing_file:primer carácter de una cadena en Bash

./r/g4/f1.JPG 
./r/g4/f2.JPG 
./r/g4/f3.JPG 
./r/g4/f4.JPG 

Pero eso md5sum debería calcularse sin el punto inicial. He escrito un script sencillo:

while read line 
do 
    echo $line | exec 'md5sum' 
done 

./g.sh < directory_listnitg.txt 

¿Cómo se quita el primer punto de cada línea?

+2

Realmente no hay necesidad de [crosspost] (http://superuser.com/questions/306947/how-to-remove-first-dot). –

Respuesta

1

Ajuste el separador de campo del separador de ruta y leer todo, excepto el material antes de la primera barra en $name:

while IFS=/ read junk name 
do 
    echo $name 
done < directory_listing.txt 
11

Puede canalizar a

cut -c2- 

que le da

while read line 
do 
echo $line | cut -c2- | md5sum 
done 

./g.sh < directory_listnitg.txt 
3

enfoque diferente, usando sed, que tiene la ventaja de que puede manejar la entrada que no se inicia con un punto. Además, no se encontrará con problemas con echo añadiendo una nueva línea a la salida, lo que hará que md5sum informe un resultado falso.

#!/bin/bash 

while read line 
do 
    echo -n $line | sed 's/^.//' | md5sum 
done < input 

comparar estos:

$ echo "a" | md5sum 
60b725f10c9c85c70d97880dfe8191b3 - 

$ echo -n "a" | md5sum 
0cc175b9c0f1b6a831c399e269772661 - 
+0

Muy elegante, gracias! – Daniel

2

Usted puede hacer todo el cosa como esta:

% sh -c `sed '[email protected]^.\(.*\)@md5sum \[email protected]' <./dirlist.txt` 

Realmente, estoy pensando que puede hacer que esto sea mucho más eficiente, pero no sé qué está generando su lista. Si puede hacerlo desde pipe, o ejecutar ese comando a través de heredoc para mantener su salida en buen estado, puede hacer que este trabajo fluya, probablemente.

EDIT:

OK, que dicen que es de un "volcado ls". Bueno, aquí hay algo un poco flexible:

% ls_dump() { 
> sed '[email protected]^.\(.*\)[email protected] \[email protected]' <<_EOF_ | sh -s 
>> `ls ${@}` 
>> _EOF_ 
> } 
% ls_dump -all -args -you /would/normally/give/ls 
<desired output> 

Creo que esto solo llama a una sola subcapa en total. Debería ser bastante bueno, pero en mi opinión, find ... -exec md5sum {} ... + es probablemente más seguro, más rápido y todo lo que necesita.

Edit2:

OK, por lo que ahora realmente responderá a la pregunta. Para quitar el primer carácter de una cadena en cualquier consola compatible con POSIX sólo se necesita mirar a la expansión de parámetros como:

${string#?} 

-Mike

+0

Gran comando, acabo de encontrar una solución para mi caso. Tuve que eliminar los primeros 3 caracteres de una cadena usando el shell POSIX, y '$ {string # ???}' funcionó para mí. ¡Gracias! – Michael

6
myString="${myString:1}" 

Comenzando en el carácter número 1 de miCadena (siendo 0 el carácter el personaje de la izquierda) devuelve el resto de la cadena. Los "s permiten espacios en la cadena. Para más información sobre ese aspecto mira $ IFS.

Cuestiones relacionadas