Ответ 1
Установите разделитель полей в разделитель путей и прочитайте все, кроме материала, перед первым косой чертой в $name
:
while IFS=/ read junk name
do
echo $name
done < directory_listing.txt
Мне нужно вычислить 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
Как удалить первую точку из каждой строки?
Установите разделитель полей в разделитель путей и прочитайте все, кроме материала, перед первым косой чертой в $name
:
while IFS=/ read junk name
do
echo $name
done < directory_listing.txt
Вы можете подключить его к
cut -c2-
Что дает вам
while read line
do
echo $line | cut -c2- | md5sum
done
./g.sh < directory_listnitg.txt
myString="${myString:1}"
Начиная с символа номер 1 myString (символ 0, являющийся самым левым символом), возвращает оставшуюся часть строки. "S" допускает пробелы в строке. Для получения дополнительной информации об этом аспекте смотрите $IFS.
Разный подход, используя 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 -
Вы можете сделать все это так:
% 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