私のスクリプトには2つの入力が必要です。 1つはfindコマンドを使用してファイルが存在することを確認すること、もう1つはファイルが存在することを確認filepath
することです。filename
#!/bin/bash
Filepath=$1
Filename=$2
if [ -z "$Filepath" ] && [ -z "$Filename" ]
then
echo "Requires Input"
elif [ ! -z "$Filepath" ] && [ ! -z "$Filename" ]
then
Found=`find "$Filepath" -iname "$Filename"`
if [ -z "$Found" ]
then
echo "Not Found"
else
echo $Found
fi
fi
これはまさに予想通りです。後でこのスクリプトにさらに条件を追加する必要がありました。つまり、filename
入力パラメータとしてのみインポートすると、以下のようにファイルシステム全体でそのファイルを検索できます。
find / -iname "$Filename"
このスクリプトに入力引数のみを渡す場合は、filepath
ファイル名引数も再エコーまたは出力する必要があります。
ベストアンサー1
私はそれをします:
#! /bin/sh -
pattern=${1?Please provide a file name}
shift
[ "$#" -gt 0 ] || set /
find "$@" -iname "$pattern" | grep '^' && exit
echo >&2 "Not found"
exit 1
つまり、名前(find
これは(大文字と小文字を区別しないため-iname
)検索する正確なファイル名ではなく、ファイル名と一致するパターンとして扱われます。)最初の引数です。他の引数は検索するディレクトリまたはファイルであり、指定されていない場合に検索されます/
。
出力を変数に保存して最後に表示するのではなく、それを渡しgrep
として使用し、ファイルが見つかった場合はtrueを報告します。
また、stdoutの代わりにstderrに「見つかりません」というメッセージを印刷し、終了状態でファイルが見つからないことを報告します。
@ThomasNが指摘したように、一般的な問題は、ファイル/ディレクトリ名を確実に渡すことができないことですfind
。 BSDの場合(呼び出し前に)、次の手順を実行してこの問題を解決できます。-delete
that-script name -delete
find
find
for i do
set -- "$@" -f "$i"
shift
done
移植可能には(ただし移植可能ではありません)、問題になる可能性がある次の相対パスを追加する-iname
必要があります。./
for i do
case $i in
(. | ./* | /*) ;; # /foo, ./foo are not a problem
(*) i=./$i
esac
set -- "$@" "$i"
shift
done
find "$@"...
しかし、これは出力に影響します(これから見てみましょう./delete/name
)-delete/name
。