フォルダとリストファイルを繰り返します。

フォルダとリストファイルを繰り返します。

3つのファイルを含む「sample」というフォルダがあります。サンプルフォルダからこれらのファイルを読み取り、カールを使用してHTTPサイトに公開するシェルスクリプトを作成したいと思います。

フォルダ内のファイルを一覧表示するために、以下を作成しました。

for dir in sample/*; do
        echo $dir;
        done

しかし、それは私に次のような結果を与えます:

sample/log

sample/clk

sample/demo

その中に親フォルダを追加します。私が望む出力は次のとおりです(親フォルダ名なし)。

log

clk

demo

どうすればいいですか?

答え1

basenameファイルの先行パスを削除するには、次の手順を実行します。

for file in sample/*; do
    echo "$(basename "$file")"
done

しかし、なぜできないのですか?

( cd sample; ls )

答え2

シェルがこれをサポートしていると仮定すると、パラメータ拡張を使用できます。

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

あるいは、そのディレクトリに変更してそこにリストを作成することもできます。

答え3

これは、ディレクトリで実行する操作によって異なります。

ディレクトリであることを確認せずに単に名前を印刷するには、lsを使用できます。

ls -1 sample

フィルタを使用できるので、 find が良いです。

find sample -type d -maxdepth 1 -printf '%f\n'

ファイルに対してコマンドを実行するには、forループの代わりにfindを使用する必要があります。

find sample -type d -maxdepth 1 -exec basename {} \;

答え4

* 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

関連情報