1

大量のファイルを bash スクリプトで編集したい。まず、ファイルへの単一のパスとカウンターが必要です。これまでのところ、私はこれを思いつきました:

let n=0
array=(`pwd`"/worker/worker*/conf/logfilefilter-worker*.xml")
for i in "${array[@]}"; do
  let "c += 1"
  echo $i
  echo $c
  # here comes the edit stuff.
done

ただし、このループは 1 回だけ実行されます。

[mles@sagnix etl-i_test]$ ./iprog_new --test
/home/devel/mles/etl-i_test/worker/worker01/conf/logfilefilter-worker01.xml     /home/devel/mles/etl-i_test/worker/worker02/conf/logfilefilter-worker02.xml /home/devel/mles/etl-i_test/worker/worker03/conf/logfilefilter-worker03.xml /home/devel/mles/etl-i_test/worker/worker04/conf/logfilefilter-worker04.xml /home/devel/mles/etl-i_test/worker/worker05/conf/logfilefilter-worker05.xml /home/devel/mles/etl-i_test/worker/worker06/conf/logfilefilter-worker06.xml /home/devel/mles/etl-i_test/worker/worker07/conf/logfilefilter-worker07.xml /home/devel/mles/etl-i_test/worker/worker08/conf/logfilefilter-worker08.xml
1

ループはファイルを 1 つずつどのように実行しますか?

4

1 に答える 1

5

これ

array=(`pwd`"/worker/worker*/conf/logfilefilter-worker*.xml")

*ファイル名のグロビング ( の場合) は引用符で囲まれた文字列で抑制されているため、 は 1 つの要素にすぎません。次に"${array[@]}"、単一の要素でグロブが展開されますが、二重引用符により、すべてのファイル名がスペースで区切られた単一の文字列のままになります。する

array=(`pwd`/worker/worker*/conf/logfilefilter-worker*.xml)

また

for i in ${array[@]}; do  # no double quotes

よく働く?一方、配列のようなバシムを使用しない、より移植性の高いソリューションについてはどうでしょうか? ファイルを反復処理する正規の方法は次のとおりです。

for file in $PWD/worker/worker*/conf/logfilefilter-worker*.xml; do
   echo "$file"
done
于 2013-05-23T10:18:12.750 に答える