0

スクリプトが作業ディレクトリで実行されるたびに、ファイル (testfile) が生成されます。その生成されたファイルをディレクトリ (testfolder) にコピーし、.ext ずつインクリメントする必要があります。

スクリプトを初めて実行する場合は、テストファイルを「testfile.0」としてテストフォルダーにコピーし、2 回目に実行する場合は、テストファイルを「testfile.1」としてテストフォルダーにコピーします。

私のスクリプト:

#!/bin/sh

file="testfile"
n=1

ls folder/${file}* | while read i
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
 done

 cp testfile folder/${file}.${n}

これは、最初のインクリメント「folder/testfile.0」でのみ機能します

4

3 に答える 3

1

問題は、パイプの使用によりwhileループがサブシェルnで実行されるため、変更が意図したとおりに機能しないことです。

一般に、プロセス置換を使用しwhileてこの問題を回避できますが、この場合、単純なforループが適切なアプローチです。

#!/bin/sh

file="testfile"
n=1

for i in folder/${file}*
do
  if [ folder/${file}.${n} = ${i} ]
  then
   n=$(( $n + 1 ))
 fi
done

cp testfile folder/${file}.${n}
于 2013-07-31T15:31:33.997 に答える
0

別の提案 - 理解しやすいコードで:

#!/bin/bash

file="testfile"
n=1

# Check for existing files with filename and count it
n=$(ls -latr folder/ |grep -i ${file} | wc -l)

# Increment above number
n=$(( $n + 1 ))

# Copy over file with the incremented number
cp $file folder/${file}.${n}
于 2016-10-27T10:20:43.493 に答える