0

私の問題は、1つのディレクトリにファイルが多すぎることです。ディレクトリを「」できませんls。cosが大きすぎます。すべてのファイルをより良いディレクトリ構造に移動する必要があります。

IDの最後の3桁を逆にフォルダとして使用しています。

たとえば、ID2018972を入力する必要があり/2/7/9/img_2018972.jpgます。

ディレクトリを作成しましたが、bashスクリプトのサポートが必要です。私はIDを知っています、範囲内にあります1,300,000 - 2,000,000。しかし、正規表現を処理することはできません。

私はこのようにすべてのファイルを移動したくありません:

/images/folder/img_2018972.jpg -> /images/2/7/9/img_2018972.jpg

私はこの主題に関するどんな助けにも感謝します。ありがとう!

4

2 に答える 2

1

編集:コメントでの説明の後、次の仮定が存在します:

  • ファイル名はまたはの形式img_<id>.jpgですimg_<id>_<size>.jpg
  • 新しいディレクトリは、 IDの最後の3桁の逆順です。

Bashの使用:

for file in /images/folder/*.jpg; do 
    fname="${file%.*}"      # remove extension and _<size>
    [[ "$fname" =~ img_[0-9]+_[0-9]+$ ]] && fname="${fname%_*}"

    last0="${fname: -1:1}"  # last letter/digit
    last1="${fname: -2:1}"  # last but one letter/digit
    last2="${fname: -3:1}"  # last but two letter/digit

    newdir="/images/$last0/$last1/$last2"
    # optionally check if the new dir exists, if not create it
    [[ -d "$newdir" ]] || mkdir -p "$newdir"

    mv "$file" "$newdir"
done

それを処理できない場合( forループには制限がない*と思いますが)、コメントで@MichałKosmulskiが提案したように 使用してください*
find

while read -r; do 
    fname="${REPLY%.*}"     # remove extension and _<size>
    [[ "$fname" =~ img_[0-9]+_[0-9]+$ ]] && fname="${fname%_*}"

    last0="${fname: -1:1}"  # last letter/digit
    last1="${fname: -2:1}"  # last but one letter/digit
    last2="${fname: -3:1}"  # last but two letter/digit

    newdir="/images/$last0/$last1/$last2"
    # optionally check if the new dir exists, if not create it
    [[ -d "$newdir" ]] || mkdir -p "$newdir"

    mv "$REPLY" "$newdir"
done < <(find /images/folder/ -maxdepth 1 -type f -name "*.jpg")
于 2012-04-16T10:24:31.150 に答える
1
find /images/folder -type f -maxdepth 1 | while read file
do
filelen=${#file}
((rootn=$filelen-5))
((midn=$filelen-6))
((topn=$filelen-7))
root=${file:$rootn:1}
mid=${file:$midn:1}
top=${file:$topn:1}
mkdir -p /images/${root}/${mid}/${top}
mv $file /images/${root}/${mid}/${top}
done
于 2012-04-16T10:47:30.153 に答える