2016-12-14 9 views
3

bashシェルでは、フルパスで$ folder(私のコードの変数名)の下にファイル名をリストしたいと思います。私は、次のようにコーディングした場合文字列をコマンドの引数として連結

しかし、

dir $folder"*" 

それがいるようです

search_str=$folder"*" 
dir $search_str 

エラー

"dir: cannot access <folder_name> : No such file or directory" 

私はこのようなコードを変更した場合、それが動作し、出力私が意図したものではなく、文字列を変数に格納し、それをdirコマンドだけに渡すと できます。

誰でも理由を知っています& search_strを使用しないでください。

答えて

0

仮定する$フォルダは、tmpが、その後 DIR $フォルダ "*" はしばらく

search_str=$folder"*" 
dir $search_str 

$ search_strは、使用dir temp

と同等です下回った場合にdir tmp*

に相当しています二重引用符を使用するには、展開するための追加ステップが必要です。シェル

5

ノートに変数展開の詳細を参照してください。問題は、一般的なシェルの行動に関し、とプラットフォームに限定されるものではないので、私は、標準的なUnixユーティリティlsではなく、以下の例でGNU-specific utility dir(おかげで、hek2mgl)を使用していますGNUユーティリティ。

TL; DR

ls "$folder"* # double-quote the var. reference, use * unquoted 

柄例えば*として(グロブ)メタキャラクタはそのように認識されるために、引用符で囲まれていないを使用しなければなりません。あなたは(ダブル)*を引用しているためこのように

ls $folder"*"は必ず ない仕事、意図するからです。シェルプロセスで二重引用符を除去するため、一方

は、変数の割り当てはsearch_str=$folder"*"、二重引用符で囲まれているので、リテラルとして$folderの値(に追加する*を引き起こし、最終的に引用符構文のの意味であるため、文字列連結の意味は、リテラルであることを意味し、この削除は適切にと呼びます。)。

はその後、ワイルドカード(パターンメタ文字)として有効*を行うコマンドls $search_strにおける変数の引用符で囲まれていない使用あります。

$search_strの値はグロブにだけでなく、単語分割、ということを意味するだけでなく、全体被写体としてあるためただし、変数のこの引用符で囲まれていない使用は、本質的堅牢ではありません元の$folder変数にの埋め込みスペースのパスが含まれていた場合、コマンドは破損します。

したがって、グロブが実際に必要とされる場合には、オンデマンド*を追加に優れている:*は引用符で囲まれていないですか

ls "$folder"* 

注 - パターンメタ文字として、それを有効にするために - "$folder"であるのに対し、意図的に二重引用符 - 確実に使用されるように、です(ワード分割とグロビングはその値に適用されません)。

+1

グッド!もしあなたが好きなら、私は[this](http://askubuntu.com/a/615946/217021)という興味深い読者を見つけました。 – hek2mgl

+0

@ hek2mgl:私はポインタを感謝します - 私は考えていなかった 'dir'存在していた:)答えが更新されました。 – mklement0

0

@ mklement0の答えでエラーの原因が説明されていますが、他にも解決策が考えられます。まず、私は他の回答から、このような ために引用符で囲まれていない使用する必要があります*として

パターン(グロブ)メタ文字は、このようなとして認識されるために必要な以下の行を借りましょう。

ケース1:あなたは(、解析だけではなく、リスト)をリストしたい場合は、再帰的にフォルダ内のファイル(ファイルのみ)、
使用[ globstar ]

shopt -s globstar 
folder="yourfoldername**" 
ls -p $folder | grep -v '/$' #mind that '$folder' is not inside double quotes 
# '-p' adds trailing slash to directories and we neglect those results using grep invert match 
# Here I inadvertantly parsed the `ls` output, see the link in case 2 for why you shouldn't do that. 

ケース2:あなたは(だけでなく、リスト)を解析したい場合は、再帰的にフォルダ内のファイル(ファイルのみ)は、ls出力が解析できないようfindを使用しています。答え[Check this]

folder="yourfoldername" #no trailing ** 
find "$folder" -type f -print0 | while read -r -d '' fname 
do 
#do something with "$fname" 
done 
+1

'ls'の出力を効果的に' grep'で構文解析しています。改行を含むファイル名は 'grep'によって2つの別々の行として見えます。 – chepner

+0

@chepner:私は誤ってやりました..私はこのメモを追加しました:) – sjsam