ワイルドカードは、他のディレクトリ(およびパーティション)で「for f in ...」と一緒には機能しません。

ワイルドカードは、他のディレクトリ(およびパーティション)で「for f in ...」と一緒には機能しません。
testingfilesizecheck.sh: line 6: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*

私はコマンドを使用していますfor f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*"

私が非常に具体的であれば"/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin"動作します。

私はLinux(Ubuntu)とbashに初めてアクセスし、google-fuを使用してこの問題を診断しようとしています。私が見つけることができるすべてのサンプルサイトでは、ワイルドカードを使用して実行する作業が機能する必要があることを示唆していますが、ターミナル/bashスクリプトが機能するのと同じディレクトリにその例を保持します。

この投稿を公開する前に、私はforループをきちんとしたコマンドとして使用するのではなく、フォルダ内のファイルのリストを少し「直接」作成し、非常に迂回しているようなlsを使用して解決策を作成しました。そのため、この場合、ワイルドカードが拡張されていない理由に対する学問的な答えを探しています。

編集:二重引用符の外にアスタリスクを入れる提案を試しました。しかし、それも動作しません。今私の答えは次のとおりです。

以下は、「bash testfilesizecheck.sh」行を入力してEnterキーを押してから端末からコピーして貼り付けたものです。

doctor@doctor-X570-AORUS-ELITE:~/Documents$ bash testingfilesizecheck.sh
/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
testingfilesizecheck.sh: line 24: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*: No such file or directory

24行目は、testinfilesizecheck.shスクリプトによって行われた他のすべての試みをコメントアウトしたものです。以下はコメント化された行を引いたスクリプトです。

#!/bin/bash

for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/"*
    do 
    echo "$f"
    actualsize=$(wc -c < "$f")
done
    echo $actualsize

同様に、/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.binにファイルがあります。

ただし、ワイルドカードはABRA.binを許可するように拡張されません。両方のバリエーションは文字通りアスタリスクにすぎません。私の考えでは、アスタリスクは変数として意味があり、他のプログラミング言語の最初の理解に基づいて引用符付きの文字列には現れません。しかし、もちろんそれは私には効果がありません。

ベストアンサー1

二重引用符は、ワイルドカード文字*(「globs」)がファイルと一致するように拡張されるのを防ぎます。代わりにリテラルアスタリスク文字として扱われます。

ワイルドカードが引用されていない場合は、次のものを代わりに使用してください。

for f in '/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category'/*

ここで重要なのは、スペースやその他の特殊文字を含む項目は引用されますが、ワイルドカードは引用されません。次のバリエーションのいずれかを使用することもできます(読みやすくするためにパスが短縮されます)。

'/media/…/Binary House/Final Structure Directory/Category'/*
'/media/…/Binary House/Final Structure Directory/Category/'*
/media/…/'Binary House/Final Structure Directory'/Category/*
/media/…/Binary' 'House/Final' 'Structure' 'Directory/Category/*

nullglob()を設定しない場合、shopt -s nullglob一致がない場合は、forリテラルアスタリスク文字を含むパスを使用してループが1回繰り返されます。これを設定できない場合は、nullglob「誤った」拡張を防ぐために、次のようなものをループの最初の行として使用してください。

[ -e "$f" ] || continue 

おすすめ記事