1

複数のフォルダーで、ファイルの名前を数値で変更できます。しかし、それは私が探している結果ではありません。私のファイル構造は次のようになります。

Pictures-
    Vacation-
        img.001.jpg                                                    
        img.002.jpg                                                   
        img.003.jpg                                                    
    Holidays-
        img.004.jpg
        img.005.jpg                                                    
        img.006.jpg                                                   
    Fun-
        img.007.jpg

私が達成したいことは次のとおりです。

Pictures-                                                                   
    Vacation-
        img.001.jpg
        img.002.jpg
        img.003.jpg
    Holidays-
        img.001.jpg
        img.002.jpg
        img.003.jpg
    Fun-
        img.001.jpg

これまでのところ、次のことを思いつきました。

a=1
for i in $vm/Holiday/*; do
    new=$(printf "%03d.jpg" ${a})
    mv ${i} $vm/Holiday/${new}
    let a=a+1
done

写真フォルダー内のすべてのディレクトリで個別にこれを実行することなく、どうすれば目的の結果を得ることができますか?

4

4 に答える 4

1

あなたのバージョンを取得して、フォルダも反復処理します。

#!/bin/bash

for dir in ~/code/stack/Pictures/*; do
        [ -d "${dir}" ] || continue
        i=1
        for img in "${dir}"/*.jpg; do
                [ -e "${img}" ] || break
                new="$(printf "%03d.jpg" "${i}")"
                echo mv "${img}" "$(dirname "${img}")/${new}"
                ((i++))
        done
done

Pictures フォルダーの場所を変更し、最初にエコーを配置してドライランします。それが欲しかったのか…?

于 2013-04-06T08:31:36.687 に答える
1

これを試して

ls > folders        #cat top folders into folders
while read folder   
   do
   cd $folder          #go to vacation folder for   example
   i=0
   ls *.jpg > files
   while read line
       do
       mv $line img.$i.jpg   #rename files according to your need
       i=$(($i+1))
       done < "files"
   rm files
   cd ..
   done < "folders"
rm folders
于 2013-04-05T21:25:54.150 に答える
0
#!/bin/bash

a=1
for i in $vm/Vacation/*; do
new=$(printf "%04d.jpg" ${a}) 
mv ${i} $vm/Vacation/${new}
let a=a+1
done

b=1
for i in $vm/Holiday/*; do
new=$(printf "%04d.jpg" ${b}) 
mv ${i} $vm/Holiday/${new}
let b=b+1
done

c=1
for i in $vm/Fun/*; do
new=$(printf "%04d.jpg" ${c}) 
mv ${i} $vm/Fun/${new}
let c=c+1
done

これは長くて退屈で、理想的ではありませんが、うまくいきます。何年にもわたって画像を見つけたときに画像を並べ替えたり追加したりするためのフォルダーがあるため、はるかに短い解決策が受け入れられていたでしょう.

于 2013-04-06T05:03:42.173 に答える
0
#!/bin/bash

function renameImages {
    local i=1;
    for oldFile in * ; do
        if [ -d "$oldFile" ] ; then
            pushd "$oldFile" >/dev/null
            renameImages
            popd >/dev/null
        elif [ "${oldFile##*.}" == "jpg" ] ; then
            newFile=$(printf img.%03d.jpg $i)
            echo "$PWD/$oldFile -> $PWD/$newFile"
            i=$((i+1))
        fi
    done
}

renameImages

これは実際にはファイルの名前を変更しませんが、代わりに画面にどのように印刷されますか。

機能に満足している場合は、変更してください

echo "$PWD/$oldFile -> $PWD/$newFile"

mv "$PWD/$oldFile" "$PWD/$newFile"

注:この回答の最初の編集では、.jpg かどうかに関係なく、すべてのファイルの名前が変更されます。このバージョンでは、.jpg の名前のみが変更されます。

于 2013-04-05T20:59:35.203 に答える