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}"
Điều đó thật sự rất sang trọng. –
+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