2011-07-06 97 views
10

tôi cần phải tính toán md5sum của một chuỗi (pathfile) trên mỗi dòng trong ls bãi của tôi, directory_listing_file:Remove ký tự đầu tiên của một chuỗi trong Bash

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

Nhưng md5sum cần được tính toán mà không có sự chấm ban đầu. Tôi đã viết một kịch bản đơn giản:

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

./g.sh < directory_listnitg.txt 

Làm thế nào để loại bỏ các dấu chấm đầu tiên từ mỗi dòng?

+2

Thực sự không cần đến [dấu chéo] (http://superuser.com/questions/306947/how-to-remove-first-dot). –

Trả lời

1

Đặt tách trường để tách đường dẫn và đọc tất cả mọi thứ ngoại trừ những thứ trước dấu gạch chéo vào $name:

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

Bạn có thể đường ống nó để

cut -c2- 

nào mang đến cho bạn

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

./g.sh < directory_listnitg.txt 
3

cách tiếp cận khác nhau, sử dụng sed, trong đó có những lợi ích mà nó có thể xử lý đầu vào mà không bắt đầu bằng một dấu chấm. Ngoài ra, bạn sẽ không gặp vấn đề với việc thêm một dòng mới vào đầu ra, điều này sẽ khiến md5sum báo cáo kết quả không có thật.

#!/bin/bash 

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

so sánh các:

$ echo "a" | md5sum 
60b725f10c9c85c70d97880dfe8191b3 - 

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

Rất thanh lịch, cảm ơn! – Daniel

2

Bạn có thể làm toàn bộ như sau:

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

Thực sự, tôi nghĩ bạn có thể làm điều này hiệu quả hơn nhiều, nhưng tôi không biết điều gì đang tạo ra danh sách của bạn. Nếu bạn có thể pipe nó từ đó, hoặc chạy lệnh đó thông qua một heredoc để giữ cho đầu ra của nó lành mạnh, bạn có thể làm toàn bộ công việc này được truyền trực tuyến, có thể.

EDIT:

OK, bạn nói đó là từ một "bãi ls." Vâng, đây là một chút linh hoạt:

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

Tôi nghĩ điều này chỉ gọi tổng cộng một vỏ. Nó nên được khá tốt, nhưng theo ý kiến ​​của tôi, find ... -exec md5sum {} ... + có lẽ là an toàn hơn, nhanh hơn, và tất cả các bạn cần.

EDIT2:

OK, vì vậy bây giờ tôi sẽ thực sự trả lời câu hỏi. Để loại bỏ các ký tự đầu tiên của một chuỗi trong bất kỳ vỏ tương thích POSIX bạn chỉ cần nhìn vào việc mở rộng tham số như:

${string#?} 

-Mike

+0

Lệnh tuyệt vời, chỉ tìm thấy một giải pháp cho trường hợp của tôi. Tôi đã phải loại bỏ 3 ký tự đầu tiên của một chuỗi bằng cách sử dụng trình bao POSIX và '$ {string # ???}' làm việc cho tôi. Cảm ơn! – Michael

6
myString="${myString:1}" 

Bắt đầu từ nhân vật số 1 của myString (nhân vật 0 là ký tự ngoài cùng bên trái) trả về phần còn lại của chuỗi. Các "s cho phép các khoảng trống trong chuỗi. Để biết thêm thông tin về khía cạnh đó, hãy xem $ IFS.

Các vấn đề liên quan