バッシュ画像処理

バッシュ画像処理

みんな、

いいね!画像ファイルを中央の画像フォルダに移動します。これは私のスクリプトです。

img_dir='/home/filies/images/'
img_fil='/home/files/img_dump.txt'
i='0'
while read -r fline
do
   fpath=$(dirname "$fline")"/"
   fname=$(basename "$fline")".$i"         
   nfile="$img_dir$fname"
   if [ ! -e "$nfile" ]; then
#      mv "$fline $img_dir$nfile"
      echo "NF=> $nfile"
   else
      ((i++))
#      mv "$fline $img_dir$nfile.$i"
      echo "F=> $fname P=> $fpath"
   fi 
done < ${img_fil}
exit

正しい結果が得られるか、少なくとも満足のいく結果が得られるまで、ファイルの移動は現在コメントアウトされています。

重複があります。現在のスクリプトは、同じファイル名の重複に対してのみカウンタを増やすのではなく、重複が発生するたびにカウンタを増やします。

これを行うより良い方法はありますか?それとも、新しいイメージディレクトリから最新の増分番号を取得するサブルーチンを作成できますか?

乾杯

光学MR

答え1

スクリプトでループを使用できます。

nfile="$img_dir$fname"
while [ -e "$nfile" ]
do
  ((i++))
  fname=$(basename "$fline")".$i" 
  nfile="$img_dir$fname"
done

これで未使用のファイル名ができました。

答え2

ワイルドカードを使用して配列にロードし、配列サイズを使用できます。

shopt -s nullglob
dups=("$nfile".*)
shopt -u nullglob
i=${#dups[@]}
((i++))

番号は1から始まるので、ファイル数が0であっても1になるように一度増やす必要があります。nullglobこれを設定する必要があります。それ以外の場合は、以下のように配列サイズが1になります。ファイル名globで空にできる配列を作成するには?shopt -u nullglobその逆は本当です。設定が解除されますnullglob

パターンに一致する他のファイル名に問題があります"$nfile".**数字だけでなく何でも一致するので注意してください。

全体の内容は次のとおりです。

img_dir='/home/filies/images/'
img_fil='/home/files/img_dump.txt'
#i='0'
while read -r fline
do
   fpath=$(dirname "$fline")"/"
   fname=$(basename "$fline")".$i"         
   nfile="$img_dir$fname"
   if [ ! -e "$nfile" ]; then
      mv "$fline $img_dir$nfile"
      echo "NF=> $nfile"
   else
      shopt -s nullglob
      dups=("$nfile".*)
      shopt -u nullglob
      i="${#dups[@]}"
      ((i++))
      mv "$fline $img_dir$nfile.$i"
      echo "F=> $fname.$i P=> $fpath"
   fi 
done < "${img_fil}"
exit 

この行に注意してください

i='0'

コメントアウトしました。まず、この場合は必要ないからです。第二に、この問題を解決するために別の方法を使用する場合、リセットしないとi各ループの後に値が増加し続けるので注意してください。while

この行に追加しましたので、.$i必要なものではない場合は削除してください。

echo "F=> $fname.$i P=> $fpath" 

関連情報