Удалите первый символ строки в Bash

Мне нужно вычислить md5sum одной строки (файла пути) на строку в моем дампе ls, directory_listing_file:

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

Но это md5sum следует вычислять без начальной точки. Я написал простой script:

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

./g.sh < directory_listnitg.txt

Как удалить первую точку из каждой строки?

Ответ 1

Установите разделитель полей в разделитель путей и прочитайте все, кроме материала, перед первым косой чертой в $name:

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

Ответ 2

Вы можете подключить его к

cut -c2-

Что дает вам

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

./g.sh < directory_listnitg.txt

Ответ 3

myString="${myString:1}"

Начиная с символа номер 1 myString (символ 0, являющийся самым левым символом), возвращает оставшуюся часть строки. "S" допускает пробелы в строке. Для получения дополнительной информации об этом аспекте смотрите $IFS.

Ответ 4

Разный подход, используя sed, который имеет то преимущество, что он может обрабатывать ввод, который не начинается с точки. Кроме того, у вас не возникнут проблемы с echo добавлением новой строки к выходу, что приведет к тому, что md5sum сообщит фиктивный результат.

#!/bin/bash

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

сравните их:

$ echo "a" | md5sum
60b725f10c9c85c70d97880dfe8191b3  -

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

Ответ 5

Вы можете сделать все это так:

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

На самом деле, я думаю, вы можете сделать это намного эффективнее, но я не знаю, что генерирует ваш список. Если вы можете pipe оттуда или запустить эту команду через heredoc, чтобы сохранить ее работоспособность, вы можете сделать эту целую работу потоком, возможно.

EDIT:

Хорошо, вы говорите это с "ls dump". Ну, вот что-то немного гибкое:

% 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>

Я думаю, что это всего лишь одна подоболочка. Это должно быть очень хорошо, но, на мой взгляд, find ... -exec md5sum {} ... +, вероятно, безопаснее, быстрее и все, что вам нужно.

EDIT2:

ОК, так что теперь я действительно отвечу на вопрос. Чтобы удалить первый символ строки в любой совместимой с POSIX оболочкой, вам нужно только посмотреть на расширение параметра, например:

${string#?}

-Mike