Bash - 调整脚本以用数字重命名文件

Bash - Adapting script to rename files with numbers

我有这个脚本

rename_files() {
  title="${1##* - }"
  for filename in "/"*.*; do
    case "${filename##*.}" in
      ext1|ext2|ext3)
        mkdir "/User/Downloaded/${title}"
        new_path="/User/Downloaded/${title}/${title}.${filename##*.}"
        echo "moving $filename -> $new_path"
        mv "$filename" "$new_path"
        ;;
    esac
  done
}

rename_category() {
  for path in "/User/Downloads/"*; do
    rename_files "$path" ""
  done
}

rename_category CAT1
rename_category CAT2

这样做

之前

.
├── Downloads
│   ├── CAT1 - Something ── File.ext1
│   └── CAT2 - SomethingElse ── OtherFile.ext1
├── Downloaded
    ├── CAT1
    ├── CAT2

之后

.
├── Downloads
│   ├── CAT1 - Something
│   └── CAT2 - SomethingElse
├── Downloaded
    ├── CAT1 ──  Something ── Something.ext1
    ├── CAT2 ──  SomethingElse ── SomethingElse.ext1

我想做的是,如果只有一个文件具有相同的扩展名,那么这些文件将被重命名,添加 _1,等等

之前

.
├── Downloads
│   ├── CAT1 - Something ├── File.ext1
                         ├── ExampleFile.ext1
│   └── CAT2 - SomethingElse ── OtherFile.ext1
├── Downloaded
    ├── CAT1
    ├── CAT2

之后

.
├── Downloads
│   ├── CAT1 - Something
│   └── CAT2 - SomethingElse
├── Downloaded
    ├── CAT1 ──  Something ── Something_1.ext1
                           ── Something_2.ext1
    ├── CAT2 ──  SomethingElse ── SomethingElse.ext1

编辑:

#!/bin/bash

rename_files() {
   title="${1##* - }"
   for filename in "/"*.*; do
   case "${filename##*.}" in
     doc|ext|ext)
       mkdir "/User/Downloaded/${title}"
       new_path="/User/Downloaded/${title}/${title}.${filename##*.}"
       let "iters=1"
       while [ -f $new_path ] ; do
          $new_path=$new_path"$iters"
          let "iters++"
       done
       echo "moving $filename -> $new_path"
       mv "$filename" "$new_path"
       ;;
   esac
   done
}

rename_category() {
  for path in "/User/Downloads/"*; do
    rename_files "$path" ""
  done
}

rename_category CAT1

EDIT2:

/User/Downloads/DOC - TEST

中有两个.doc个文件
/User/Downloads/DOC - TEST/Sample-doc-file-100kb.doc
                          /Sample-doc-file-200kb.doc

我要的是

/User/Downloaded/TEST/TEST_1.doc
                     /TEST_2.doc

这是输出日志

chmod +x /User/TEST.sh
sh /User/TEST.sh
moving /User/Downloads/DOC - TEST/Sample-doc-file-100kb.doc -> /User/Downloaded/TEST/TEST.doc
mkdir: /User/Downloaded/TEST: File exists
/User/TEST.sh: line 12: /User/Downloaded/TEST/TEST.doc=/User/Downloaded/TEST/TEST.doc1: No such file or directory
/User/TEST.sh: line 12: /User/Downloaded/TEST/TEST.doc=/User/Downloaded/TEST/TEST.doc2: No such file or directory

等等

更新输出日志

sh /User/Script.sh 
moving /User/Downloads/DOC - TEST/Sample-doc-file-100kb.doc -> /User/Downloaded/TEST/TEST.doc
mv: rename {/User/Downloads/DOC - TEST/Sample-doc-file-100kb.doc} to {/User/Downloaded/TEST/TEST.doc}: No such file or directory
mkdir: /User/Downloaded/TEST: File exists
moving /User/Downloads/DOC - TEST/Sample-doc-file-200kb.doc -> /User/Downloaded/TEST/TEST.doc
mv: rename {/User/Downloads/DOC - TEST/Sample-doc-file-200kb.doc} to {/User/Downloaded/TEST/TEST.doc}: No such file or directory

输出已更新

这是我的初始情况

User/Downloads/DOC - TEST/SampleDoc.doc
                         /OtherSampleDoc.doc
                         /OtherDoc.doc

User/Downloaded/

脚本后我只得到

User/Downloads/DOC - TEST/OtherSampleDoc.doc
                         /OtherDoc.doc

User/Downloaded/TEST/TEST.doc

但我想要的是

User/Downloads/DOC - TEST

User/Downloaded/TEST/TEST_1.doc
                    /TEST_2.doc
                    /TEST_3.doc

这是输出

sh /User/Script.sh 
moving /User/Downloads/DOC - TEST/OtherDoc.doc -> /User/Downloaded/TEST/TEST.doc
mkdir: /User/Downloaded/TEST: File exists
/User/Script.sh: line 12: /User/Downloaded/TEST/TEST.doc=/User/Downloaded/TEST/TEST.doc1: No such file or directory
/User/Script.sh: line 12: /User/Downloaded/TEST/TEST.doc=/User/Downloaded/TEST/TEST.doc2: No such file or directory
/User/Script.sh: line 12: /User/Downloaded/TEST/TEST.doc=/User/Downloaded/TEST/TEST.doc3: No such file or directory
etc.
rename_files() {
   title="${1##* - }"
   for filename in "/"*.*; do
   case "${filename##*.}" in
     ext1|ext2|ext3)
       mkdir "/User/Downloaded/${title}"
       new_path="/User/Downloaded/${title}/${title}.${filename##*.}"
       let "iters=1"
       while [ -f $new_path ] ; do
          new_path=$new_path"$iters"
          let "iters++"
       done
       echo "moving $filename -> $new_path"
       mv "${filename}" "${new_path}"
       ;;
   esac
   done
}