2012-05-11 11 views
3

私は、Linuxに新しいっぽいだし、プログラミングの初心者が、forループにファイルのリストを渡すためのコードhereの数行を一緒にパッチを適用することができました、そしてフォルダと同じことを行うためhereforループに変数(フォルダのリスト)を渡す方法は?

# Run search.sh from base folder; 
# Only interested in folders under base folder (e.g., baseFolder/FolderA) 
# list all folders in base directory that match search parameters; 
# cut out just the folder name; feed to variable DIR 

DIR=$(find . -name *MTL.txt | cut -d '/' -f2) 

# echo $DIR = "FolderA FolderB FolderC" 
# place that information in a for-loop 

    for i in $DIR; do 

     cd $DIR # step into folder 

     # find specific file in folder for processing 
     FILE=$(find -name *MTL | cut -d '/' -f2) 

     # copy in a static file from another folder; 
     # rename file based on file name found in previous step 
     cp /baseFolder/staticfile.txt $FILE.new 
     do more stuff 

     cd .. # step out of directory 

    done 

コードは最初のディレクトリで正常に完了しますが、後続のディレクトリに移動できません。私は私の(多くの)問題の1つは、私のように$ DIRにフォルダ名のリストを渡すことができないと思っています。これはかなりシンプルなはずですが、私のfooは弱いです。

私は方法を示してください。

EDIT:

が所望の効果を持っていた "私は、CD $" に "のCDの$ DIR" を変更します。コードはすべてのディレクトリをループし、それぞれのディレクトリ内で正しく操作を実行します。 -Thx to core1024は、上記にフラグを立てます。

+0

ところで...あなたはドットを欠場しないでください。 'find'の後に 'FILE = $(find -name * MTL | cut -d'/'-f2) 'と表示されますか? –

+0

私は専門家ではありませんが、 'cd $ DIR#step into folder'は' cd $ i#step into folder'だと思います。 – core1024

+0

@ core1024:私のコードでその小さなものを1つ変更すると、すべてがうまくいきました!答えとして投稿できますか?どうも。 – Prophet60091

答えて

1

私は専門家ではないが、私はcd $DIR # step into folderは、ディレクトリ名にスペースが埋め込まれている場合cd $i # step into folder

4

CD ..ディレクトリ

のうち#ステップは、ちょうど1つ上のレベルに繰り返します。

あなたは変数に自分の "ベースディレクトリ" を保存するために、ループの前に、必要があります。

BASEDIR=`pwd` 

次に、あなたの代わりにあなたの現在の

cd $BASEDIR # step out of directory 

を実行します

CD ..

+0

彼は 'DIR'をどのように生成するかに基づいて、彼は決して' cd 'で1レベル以上深く進まないでしょう。 – chepner

+0

@chepner:今言及しました...しかし、それは私の提案があまり合法ではありません:) –

0

「Forループ」しかし必要はありません。 findコマンドはすでに見つかったすべての項目をループします。

特定のコマンドに「見つかった」すべてのアイテムを渡すfindコマンドの-execオプションがあります。

find . -name *MTL.txt -exec cp {} /basefolder \; 

あなたは、ループのリストとしてコマンドからの出力を使用することができますforループを使用することについて強く感じた場合、これは/ basefolder

に見つかったすべてのファイルをコピーします。

for MYVAR in `ls *.txt* ` 
do 
    echo $MYVAR 
done 

出力の書式設定や出力をstdoutに送信しない限り、cutを使用することは一般的にはお勧めできません。あなたの元のコードは、それを複数回行うだろう、私は一度だけ、各サブディレクトリに降り

for subdir in *; do 
    if [[ ! -d $subdir ]]; then 
    continue 
    fi 

    cd $subdir 
    for f in *MTL.txt; do 
    cp /baseFolder/staticFile.txt $f.new 
    # And whatever else 
    done 

    cd .. 
done 

注:それはfind出力を解析する必要がないため

+0

決して、 '' varの\ 'ls \' 'では決して、 [真剣に](http://mywiki.wooledge.org/ParsingLs)。 'MYVAR for * .txt *' –

0

次は、少し簡単です。私はあなたの意図した場合にはこれを指摘しています。また、あなたのcutコマンドが複数のディレクトリを深く辿るのを妨げてしまったので、私はそれがあなたの意図であると仮定しました。

他のものに応じて、ディレクトリを完全に変更することを避けることができます。たとえば:

for f in $subdir/*MTL.txt; do 
    cp /baseFolder/staticFile.txt $f.new 
    # More stuff 
done 
0

あなたの元のコードが壊れるなければならないことだと思います。また、ディレクトリ内の検索条件を満たす複数のファイルがある場合は、その操作を繰り返します。 代替:

IFS=' 
' 
declare -a DIR 
declare -a FILE 
DIR=($(find . -name '*MTL.txt' | cut -f2 -d '/' | uniq)) 
for x in "${DIR[@]}" 
do 
    if [ -d "$x" ]; then 
    pushd "$x" 
     FILE=($(ls *MTL)) 
     for y in "${FILE[@]}" 
      do 
      cp /baseFolder/staticfile.txt "$y" 
      echo do more stuff 
      done 
    popd 
    fi 
done 
+0

'ls'は必要ありません。 'FILE =(*)' –

関連する問題