2017-05-11 3 views
0

フォルダ内のすべての.txtファイルを検索し、ベース名を取得してからファイルを再配置するbashスクリプトを作成しようとしています。しかし、ファイル名と文字列を組み合わせようとするたびに、見つかった実際のファイルの代わりにforループから "* .txt"ワイルドカードが出力されるという問題があります。変数をエコーするだけで、期待されるファイル名が出力されます。BASH変数が文字列値と組み合わせて値を変更する

以下に簡略化したスクリプトとその出力を示しました。私はBASHの新人です。これは変数を扱う方法と関係があると思います。私は数時間の説明を探していましたが、実際には何も思い付いていません。連結したときに値が変化する理由を誰でも説明できますか?ここで

はサンプルコードです:ここで

TEMP_PATH=C/Test 

for testFile in $TEMP_PATH/*.txt; do 
    testFileName=$(basename "$testFile") 
    echo $testFileName 
    echo "FileName:$testFileName" 
done 

それぞれからの出力例は、ここで

TestOne.txt 
FileName:*.txt 

をエコーされたディレクトリ内のファイルがあります。 TestingToo.shは上に示したスクリプトです

TestingToo.sh TestOne.txt 

助けていただければ幸いです!ありがとうございました。

+0

を試してみてください。記述された環境であなたのスクリプトを実行すると、 'TestOne.txt FileName:TestOne.txt'が期待通りに得られます – nsilent22

+0

Hmm。私はちょうど私がここに書かれている通りにスクリプトをコピーしてみました。それでも、私にとっては同じ出力が得られます。 これは奇妙なことですが、Windowsシステムでこれを実行しているのかどうかは不思議です。私はgit bashとWindows 10の開発者bashを試してみました。どちらも同じ結果を生みます... – 99problemsMvcIsOne

+0

C/Testの下にいくつかのtxtファイルがありますか?そうでない場合、$ TEMP_PATH/*。txt **という文字列はC/Testの下のファイルのリストに展開されません。これは "そのまま"となりますので、変数 'testFile'を' C/Test/*。txt'に設定することになります。次のコマンドは 'testFileName'を' * .txt'に設定します。次に最初のechoコマンドで、bashは '* .txt'を現在のディレクトリの' TestOne.txt'にマッチするファイルのセットに置き換えます。しかし、2番目のエコーコマンドでは 'FileName:*。txt'パターンと一致するファイルはありません。だから、bashはそれをそのまま残します。 – nsilent22

答えて

1

は、私はあなたの結果を再現することができません。この

#!/usr/bin/env bash 

TEMP_PATH=~/temp 
TARGET_PATH=~/temp2 

filenames=`find "$TEMP_PATH" -name "*.txt" ` 

if [ -z "$filenames" ] ; then echo "files not found" ; exit ; fi 

for testFile in $filenames; do 
    testFileName=$(basename "$testFile") 
    echo $testFileName 
    mv "${testFile}" "${TARGET_PATH}/${testFileName}" 
done 
関連する問題