Bash - 将数字移动到特定的字符串位置

Bash - Move a number into a specific string location

我正在尝试了解如何更改脚本以使输出文件不是 TEST.docTEST.doc1TEST.doc12 等,而是 TEST.docTEST_1.docTEST_2.doc等。更简单地说,就在具体已知的.extension之前。(txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf).

我该怎么做?

这里是脚本

#!/bin/bash

rename_files() {
   title="${1##* - }"
   for filename in "/"*.*; do
   case "${filename##*.}" in
     txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
       mkdir -p -m 777 "/Users/Desktop/Documents Share/Downloaded/${title}"
       new_path="/Users/Desktop/Documents Share/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 "/Users/Desktop/Documents Share/Downloads/"*; do
    rename_files "$path" ""
  done
}

rename_category DOC

编辑:

fromdir="/Users/Desktop/Downloads/"  
todir="/Users/Desktop/Documents Share/Downloaded//"

rename_files() {
   title="${1##* - }"
   let "iters=0"
   for filename in "/"*.*; do
     case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
         new_path="${todir}//${title}.${filename##*.}"
            new_path=$new_path  # removed "$iters"
            let "iters++"
            # extract $path without dot + extension
            new_path_basename=${new_path%*.*};
            # Extract extension from $path
            ext=${new_path##*.};
            echo "moving $filename -> ${new_path_basename}_${iters}.${ext}"
            # Add ${iters} before extension
            mv "${filename}" "${new_path_basename}_${iters}.${ext}"
         ;;
     esac
   done
}

rename_category() {
  for path in "${fromdir}"*; do
    rename_files "$path" ""
  done
}

rename_category DOC
rename_category PRJ

之前:

/Users/Desktop/Downloads/DOC - TESTDOC/AFile.doc
                                      /AnotherFile.doc

/Users/Desktop/Downloads/PRJ - TESTPRJ/AFile.pdf
                                      /AnotherFile.pdf

之后:

/Users/Desktop/Documents Share/Downloaded/DOC/TESTDOC_1.doc
                                             /TESTDOC_2.doc

/Users/Desktop/Documents Share/Downloaded/PRJ/TESTPRJ_1.pdf
                                             /TESTPRJ_2.pdf

EDIT2:

有两个测试文件: big_buck_bunny_240p_50mb.mp4big_buck_bunny_240p_50mb copy.mp4

输出日志

sh Script.sh

moving /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb copy.mp4 -> /Users/Desktop/Documents Share/Downloaded/MOV/TEST_1.mp4

cp /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb copy.mp4 /Users/Desktop/Documents Share/Downloaded/MOV/TEST_1.mp4

moving /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb.mp4 -> /Users/Desktop/Documents Share/Downloaded/MOV/TEST_2.mp4

cp /Users/Desktop/Downloads/MOV - TEST/big_buck_bunny_240p_50mb.mp4 /Users/albertorapolla/Desktop/Documents Share/Downloaded/MOV/TEST_2.mp4

EDIT3:

脚本的最后更新(不是 "special" 那个)

#!/bin/bash

fromdir="/Users/Desktop/Downloads/"
todir="/Users/Desktop/Documents Share/Downloaded/"

rename_files() {
    title="${1##* - }"
    exttitle=""
    iters=0
    numfiles=$(ls -l "/"*.* | wc -l)
    for filename in "/"*.*; do
      new_path="${todir}${title}/${title}.${filename##*.}"
      iters=_$(( ++i ))
      # extract $path without dot + extension
      new_path_basename=${new_path%*.*};
      # Extract extension from $path
      ext=${new_path##*.};
      if [ "$numfiles" -eq 1 ]; then
          iters=""
      fi
      case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
        mkdir -p -m 777 "${todir}${title}"
        echo "moving $filename -> ${new_path_basename}${iters}.${ext}"
        # Add ${iters} before extension
        mv "${filename}" "${new_path_basename}${iters}.${ext}"
      ;;
      esac
    done
}

rename_category() {
  for path in "${fromdir}"*; do
    rename_files "$path" ""
  done
}

rename_category DOC

试试这个(评论在脚本中):

rename_files() {
    title="${1##* - }"
    exttitle=""
    iters=0
    numfiles=$(ls -l "/"*.* | wc -l)
    for filename in "/"*.*; do
      new_path="${todir}${exttitle}/${title}.${filename##*.}"
      iters=_$(( ++i ))
      # extract $path without dot + extension
      new_path_basename=${new_path%*.*};
      # Extract extension from $path
      ext=${new_path##*.};
      if [ "$numfiles" -eq 1 ]; then
          iters=""
      fi
      case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
        mkdir -p -m 777 "${todir}${exttitle}"
        echo "moving $filename -> ${new_path_basename}${iters}.${ext}"
        # Add ${iters} before extension
        mv "${filename}" "${new_path_basename}${iters}.${ext}"
      ;;
      esac
    done
}

rename_category() {
  for path in "${fromdir}"*; do
    rename_files "$path" ""
  done
}

rename_category DOC