サブディレクトリ内の複数のファイルの名前をそのディレクトリ名に変更します。

サブディレクトリ内の複数のファイルの名前をそのディレクトリ名に変更します。

私のデスクトップにModelsというフォルダがあります。そのフォルダ内には、.jpg拡張子を持たないJPEGファイルを含む名前付きフォルダがあります。 JPEGファイル名は任意のハッシュです。 bashスクリプトを使用して、これらのjpegファイルの名前をディレクトリ名に徐々に一括変更し、各ファイルに.jpg拡張子を追加したいと思います。

基本的には

ロールモデル/

 Alice/
      a5ccB2ff3e
      ee420bc4a
      2acee54dc
      ...
 Alex/
      de33fa24c0
      d1eaa48e0a
      ...

私はそのような人になりたい

ロールモデル/

 Alice/
      Alice001.jpg
      Alice002.jpg
      Alice003.jpg
      ...

 Alex/
      Alex001.jpg
      Alex002.jpg
      ...

答え1

あなたの質問の説明に基づいて、私は仮定します。フォルダ内のファイルの総数は999を超えることはできません。

以下は単純なbashスクリプトです。最上位ディレクトリ(モデルなど)で実行します。

#!/bin/bash
for i in ./*
do
if [ -d "$i" ]
then
j=001
for k in "$i"/*
do
mv "$k" "$i"/"$i""$j".jpg
j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi
(( j++ ))
j=`printf '%03i' $j`
done
fi
done

まず、ディレクトリであるかどうかに関係なく、Modelsのすべてのファイルを確認しますif [ -d "$i" ]。次に、そのディレクトリ内のすべてのファイルの名前がmv "$k" "$i"/"$i""$j".jpg

j=${j#0}
if [ ${j:0:1} -eq 0 ]
then 
j=${j#0}
fi

上記のコードは最初からすべてのゼロを削除するため、次のエラーは発生しません。

 ((: 008: value too great for base (error token is "008")
 printf: 008: invalid octal number

そして

j=`printf '%03i' $j`

j値を3ビット長にします。

答え2

Debian_yadav提案の単純化されたバージョンを試すこともできます:

for i in *
  do    if [ -d "$i" ] && cd "$i"
          then  j=0
                for k in *
                  do    ((j++))
                        echo mv "$k" $(printf "%s%03d.jpg" $i $j )
                  done
                cd ..
          fi
  done

デバッグ専用ですecho。表示される内容が気に入ったら削除してください。

利用可能なすべてのディレクトリに移動cdしてカウンタをリセットし、すべてのターゲットファイルを繰り返し、各ディレクトリのカウンタを増やし、名前を変更します。

関連情報