「sample」という名前のフォルダーがあり、その中に3つのファイルがあります。サンプルフォルダー内のこれらのファイルを読み取り、curlを使用してHTTPサイトに投稿するシェルスクリプトを記述したいと思います。
フォルダ内のファイルを一覧表示するために次のように記述しました。
for dir in sample/*; do
echo $dir;
done
しかし、それは私に次の出力を与えます:
sample/log
sample/clk
sample/demo
その中に親フォルダを付けています。次のように出力したい(親フォルダー名なし)
log
clk
demo
どうすればよいですか?
basename
を使用して、ファイルから先頭のパスを取り除きます。
for file in sample/*; do
echo "$(basename "$file")"
done
なぜそうではないのですか?
( cd sample; ls )
シェルがサポートしていると仮定すると、パラメーター拡張を使用できます
for path in sample/*; do
printf -- '%s\n' "${path##*/}"
done
または、そのディレクトリに移動して、そこでリストを作成することもできます
* nixシステムでは、ほぼすべての文字をファイル名の一部(空白、改行、コンマ、パイプ記号などを含む)にすることができるため、シェルスクリプトで「ls」コマンドの出力を解析しないでください。信頼できません。 lsの出力を解析しない理由 を参照してください。
「検索」を使用してファイルのリストを作成します。 Bashを使用している場合は、「find」の出力を配列に挿入できます。以下の例では、機能しない「curl」コマンドを使用したという警告があります。
searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)
if [[ ${#oldFiles[@]} -ne 0 ]]; then
for file in "${oldFiles[@]}"; do
curl -F ‘data=@"$file"’ UPLOAD_ADDRESS
done
fi
これは、ディレクトリをどのように処理するかによって異なります。
それがディレクトリであるかどうかをチェックせずに単に名前を出力するには、lsを使用できます。
ls -1 sample
フィルターを使用できるので、見つけた方が良いでしょう。
find sample -type d -maxdepth 1 -printf '%f\n'
ファイルに対してコマンドを実行する場合は、forループではなくfindを使用する必要があります。
find sample -type d -maxdepth 1 -exec basename {} \;