2011-05-02 14 views
5

私はLSに「$変数」フォーム内のすべてのファイルを私のスクリプトを取得しようとしている。*bashスクリプトは

パラメータは、常に私がしたい0.001 拡張子を持つファイルであります

first="$1" 
others=${first%.001} 
ls $others"*" 

私の問題はfile[success].mpg.001 と何LSに供給されますfile[success].mpg*をあるという名前のファイルである例えば、同じ名前で異なる拡張子、$ file.002、file.003など例えば:を持つすべてのファイルを検索します私に与えるもの ls: cannot access file[success].mpg*: No such file or directory 参照するには210人のニーズ:

file\[success\].mpg* 

私はすべてをしようとしてきた、私は予告をした一つのことは、私は、ファイル= $ 1をやった後 LSはパラメータ$ 1作品を与えますが、いない場合は供給$ファイルです。 変数をパラメータに変更するにはどうすればよいでしょうか?

答えて

6

。さらに、あなたは*を引用する必要はありません。

#!/bin/bash 
first="$1" 
others=$(printf %q "${first%.001}") 
ls $others* 

printf %qは(bashのmanページにについて)シェルの入力として使用できる形式で文字列を再フォーマットします。コメントに係る

編集:
上記のソリューションは、ファイル名に空白では動作しません。 (すでに述べたように、いくつかの他の回答のように)そのような場合のために、それはprintfを使用しない方が良いですが、すべての変数を正しく引用する:

#!/bin/bash 
first="$1" 
others="${first%.001}" 
ls -- "$others"* 
+0

ありがとうそんなにとは異なる方法を使用する必要がありますね! – geekmagii

+0

私はあなたを助けることができてうれしいです。 – bmk

+1

これは、名前に角括弧が含まれていて、空白などの他の奇数文字ではないファイルに有効です。例えば、私は './findfiles1「テスト[成功] .mpg.001を」'試みたが、それは2つのファイル名とすることを解析され、いずれかを見つけることができませんでした: 'のLS:\ [成功は\]のmpg *:そのようなファイルまたはディレクトリ '' ls:test \:No such file or directory'と入力します。 –

1

使用すると、代わりにLSを見つける:あなたは、文字列を再フォーマットするbashprintfコマンドを使用することができます

$ ls weg.* 
ls: weg.*: No such file or directory 
$ find . -name weg.\* 
$ 
+1

(HTTP [1以上の理由から]:// mywiki.wooledge.org/ParsingLs) – l0b0

+0

が見つかりました。 -name file [成功] .mpg *何も見つかりません。 l0b0の答えから – geekmagii

+1

は、私はちょうどLS – geekmagii

2

あなたはあまりにも遠くはありません。私の最初の修正は、以下の3行を変更します

ls -- "${others}".* 

これは$othersを拡張し、グロブが発生することができます。 *をすべての一致するファイル名のリストに展開するのはシェルの責任です。ファイル名のリストはlsに送られます。何のファイルが存在しない場合、シェルはLSへのグロブを渡し、それがアスタリスクが表示されます、

file1.001 file1.002 file1.003 ... 

:しかし、ほとんどの場合、LSはこのようなものが表示されますように聞こえるこのよう

file1.* 

を、あなたの行、ls $others"*"は、lsが見るリテラルアスタリスクを付加しています。

ファイル名がfile1.*(アスタリスクを含む)でない限り、lsは失敗します。

別のオプションは、ベース名を使用することです:basenameを使用して

first="$1" 
others=`basename -- "$first" .001` 
ls -- "${others}".* 

等、あなたにそれがディレクトリを削除することができるという利点を提供します他の人はあなたがファイルのリストをやっていることに応じて、指摘しているよう

しかし、findが良いかもしれません。

EDIT:ダブルハイフンはすべての* nixバリアントでは機能しませんが、lsbasenameコマンドには他のcli引数がないことを伝えます。あなたの変数を引用符で囲むことはベストプラクティスかもしれませんが、データが信頼できない場合を除いて、それらを残すことが簡単です。あなたのデータを知り、適切に引用してください。

+0

変数が正しく引用符で囲まれていないため、ファイル名にスペースやその他の特殊文字が含まれていると問題が発生します。代わりに 'ls - " $ others "*'と 'basename - " $ first "'を使用してください。 – Philipp

+0

@Philipp - 十分に編集されています。 –

5

あなたは、ワイルドカードではないが、変数を引用する必要があります:othersがダッシュで始まる場合、このコードでも動作するはずですように

ls -- "$others"* 

ダブルダッシュはオプションの検索を停止します。 lsが少なからずスクリプトで間違って解決すること

は注意してください。リストを実際に印刷する場合にのみ使用してください。長い形式で:あなただけの名前を印刷したい場合は

ls -l -- "$others"* 

、あなたはまったくlsを必要としない:

echo "$others"* 

残念ながらあなたはecho--を使用することはできません。ただし、ファイル名の配列をしたい場合は 、使用、

filenames=("$others"*) 

を使用して、あなたがそれらを反復処理したいはずです

for filename in "$others"*