2010-03-16 31 views
7

Tôi đang cố gắng viết một tập lệnh tìm kiếm một thư mục cho các tệp và tìm kiếm mẫu. Tương tự như dưới đây ngoại trừ biểu thức tìm thấy phức tạp hơn nhiều (không bao gồm các thư mục và tệp cụ thể).Xóa đối số tập lệnh bash cuối cùng

#!/bin/bash 
if [ -d "${!#}" ] 
then 
    path=${!#} 
else 
    path="." 
fi 

find $path -print0 | xargs -0 grep "[email protected]" 

Rõ ràng, các bước trên không hoạt động vì "[email protected]" vẫn chứa đường dẫn. Tôi đã thử các biến thể của việc xây dựng một danh sách đối số bằng cách duyệt qua tất cả các đối số để loại trừ con đường như

args=${@%$path} 
find $path -print0 | xargs -0 grep "$path" 

hoặc

whitespace="[[:space:]]" 
args="" 
for i in "${@%$path}" 
do 
    # handle the NULL case 
    if [ ! "$i" ] 
    then 
     continue 
    # quote any arguments containing white-space 
    elif [[ $i =~ $whitespace ]] 
    then 
     args="$args \"$i\"" 
    else 
     args="$args $i" 
    fi 
done 

find $path -print0 | xargs -0 grep --color "$args" 

nhưng những thất bại với đầu vào trích dẫn. Ví dụ:

# ./find.sh -i "some quoted string" 
grep: quoted: No such file or directory 
grep: string: No such file or directory 

Lưu ý rằng nếu [email protected] không chứa đường dẫn, tập lệnh đầu tiên sẽ làm những gì tôi muốn.


EDIT: Cảm ơn những giải pháp tuyệt vời! Tôi đã đi với một sự kết hợp các câu trả lời:

#!/bin/bash 

path="." 
end=$# 

if [ -d "${!#}" ] 
then 
    path="${!#}" 
    end=$((end - 1)) 
fi 

find "$path" -print0 | xargs -0 grep "${@:1:$end}" 

Trả lời

8

EDIT:

gốc chỉ là một chút đi. Không loại bỏ được thực hiện nếu đối số cuối cùng không phải là một thư mục.

#!/bin/bash 
if [ -d "${!#}" ] 
then 
    path="${!#}" 
    remove=1 
else 
    path="." 
    remove=0 
fi 

find "$path" -print0 | xargs -0 grep "${@:1:$(($#-remove))}" 
+1

Điều đó thật sự rất sang trọng. –

+1

+1 Tôi đã học được 2 điều từ câu trả lời của bạn và tôi sử dụng bash trong hơn 10 năm – Tino

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