フォルダーをループしてファイルを一覧表示する


14

「sample」という名前のフォルダーがあり、その中に3つのファイルがあります。サンプルフォルダー内のこれらのファイルを読み取り、curlを使用してHTTPサイトに投稿するシェルスクリプトを書きたいのですが。

フォルダ内のファイルを一覧表示するために、次のように記述しました。

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

しかし、それは私に次の出力を与えます:

sample/log

sample/clk

sample/demo

その中に親フォルダを付けています。次のように出力したい(親フォルダー名なし)

log

clk

demo

どうすればよいですか?


1
最初に「cd」を使用します。「カール」が必要な場合でも、ディレクトリを入力する必要があります。また、あなたecho ${dir##*/}は道を外すのに使うことができます。
utopic eexpress 2017

回答:


32

basenameファイルから先頭のパスを取り除くために使用します。

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

なぜだろう:

( cd sample; ls )

3

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

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

または、そのディレクトリに移動して、そこでリストを作成することもできます


1
ここ--では必要ありません。最初の引数は、ダッシュのない固定文字列です。
クサラナンダ

また、${parameter##pattern}すべてのPOSIXシェルでサポートされています。
クサラナンダ

2

* 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

ここのディレクトリは何ですか?$ '\ 0'?変数にあるディレクトリを渡したい...
Soylent Graham

searchDirはディレクトリ変数です。"-d $ '\ 0'"は、読み取りコマンドの区切り文字をnullに設定します。
bb_referee

shシェルで同じことをするにはどうすればよいですか?#!/ bin / shを使用しています
Ayusman

1

それは、ディレクトリをどのように処理するかによって異なります。

名前がディレクトリであるかどうかを確認せずに単に名前を出力するには、lsを使用します。

ls -1 sample

フィルターを使用できるので、見つけたほうがよいでしょう。

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

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

find sample -type d -maxdepth 1 -exec basename {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.