4

私は Linux の初心者であり、プログラミングの初心者ですが 、ファイルのリストを for ループに渡すための数行のコードと、フォルダーで同じことを行うためのコードをここでパッチすることができました。

# 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 は弱いです。

先生、道を教えてください。

編集:

「cd $DIR」を「cd $i」に変更すると、望ましい効果が得られました。コードはすべてのディレクトリをループし、各ディレクトリ内で正しく操作を実行するようになりました。-上記にフラグを立てるためのcore1024へのThx。

4

5 に答える 5

4

cd .. # ディレクトリから出る

ワンレベル上がるだけです。

ループの前に、「ベースディレクトリ」を変数に保存する必要があります。

BASEDIR=`pwd`

次に、実行します

cd $BASEDIR # step out of directory

あなたの現在の代わりに

CD ..

于 2012-05-11T14:05:02.850 に答える
1

私は専門家ではありませんが、そうcd $DIR # step into folderすべきだと思いますcd $i # step into folder

于 2012-05-11T17:16:27.367 に答える
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
于 2012-05-11T19:01:11.020 に答える
0

ただし、「For ループ」は必要ありません。find コマンドは、見つかったすべてのアイテムを既にループしています。

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

例えば

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

これにより、見つかったすべてのファイルが /basefolder にコピーされます

for ループの使用を強く希望する場合は、コマンドからの出力をリストとしてループに使用することもできます。

例えば

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

出力をフォーマットする場合や、出力を stdout に送信しないコマンドを使用する場合を除き、cut を使用することは一般的にお勧めできません。

于 2012-05-11T14:42:51.530 に答える
0

find以下は、出力を解析する必要がないため、少し単純です。

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

元のコードが複数回実行する場合に、各サブディレクトリに 1 回だけ降りることに注意してください。それがあなたの意図であった場合に備えて、私はこれを指摘します。また、あなたのcutコマンドは複数のディレクトリを深くすることを妨げていたので、それがあなたの意図であると思いました。

他の操作によっては、ディレクトリの変更を完全に回避できる場合があります。例えば:

for f in $subdir/*MTL.txt; do
  cp /baseFolder/staticFile.txt $f.new
  # More stuff
done
于 2012-05-11T14:42:59.260 に答える