##
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##  http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
##

##
## $Rev$ $Date$
##

command.description=Find files in a hierarchy.

command.option.addNameFilter=Include files with names matching GLOB
command.option.addNameFilter.token=GLOB

command.option.addInameFilter=Like -name, but the match is case insensitive
command.option.addInameFilter.token=GLOB

command.option.addTypeFilter=Include files matching a type

command.argument.path=Path of file to root search under 
command.argument.path.token=PATH

command.manual=\
  TODO: find manual