4

理由が正確にわからない:

for f in `find . -name "strain_flame_00*.dat"`; do
   echo $f
   mybase=`basename $f .dat`
   echo $mybase
done

動作し、:

for f in `ls strain_flame_00*.dat`; do
   echo $f
   mybase=`basename $f .dat`
   echo $mybase
done

そうではありません。つまり、ファイル名からサフィックスが削除されることはありません。出てくるもののlsフォーマットが違うからだと思いますが、よくわかりません。eval私もlsの前に入れようとしました...

4

3 に答える 3

11

ここでファイル名を反復処理する正しい方法は次のとおりです。

for f in strain_flame_00*.dat; do
   echo "$f"
   mybase=$(basename "$f" .dat)
   echo "$mybase"
done

グロブパターンで使用forし、ファイル名へのすべての参照を引用符で囲むことが、空白を含む可能性のあるファイル名を使用する最も安全な方法です。

于 2012-12-12T01:26:35.400 に答える
4

まず第一に、lsコマンドの出力を解析しないでください。

使用する必要があり、どのエイリアスが存在するlsかわからない場合は、次のようにします。ls

(
COLUMNS=
LANG=
NLSPATH=
GLOBIGNORE=
LS_COLORS=
TZ=
unset ls
for f in `ls -1 strain_flame_00*.dat`; do
  echo $f
  mybase=`basename $f .dat`
  echo $mybase
done
)

既存の環境、エイリアス、シェル変数を保護するために括弧で囲まれています。

さまざまな環境名がNUKEDでした(lsそれらを検索するように)。

1つのunaliasコマンド(自明)。

1つの未設定のコマンド(ここでも、巧妙な過剰支配の「ls」関数に対する保護)。

これで、「ls」を使用しない理由がわかります。

于 2012-12-12T01:14:38.230 に答える
2

まだ言及されていないもう1つの違いはfind、デフォルトでは再帰検索ですが、lsそうではないことです。(オプションを使用して両方を再帰的/非再帰的に実行するようにfind指示できますが、指定された深さまで再帰的に実行するように指示できます)

そして、他の人が述べているように、それがグロブによって達成できるのであれば、どちらも使用しないようにする必要があります。

于 2012-12-12T01:18:05.397 に答える