【问题标题】:Bash - Move a number into a specific string locationBash - 将数字移动到特定的字符串位置
【发布时间】:2016-03-22 10:11:21
【问题描述】:

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

我该怎么做?

这里是脚本

#!/bin/bash

rename_files() {
   title="${1##*${2} - }"
   for filename in "$1/"*.*; 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/${1}"*; do
    rename_files "$path" "$1"
  done
}

rename_category DOC

编辑

fromdir="/Users/Desktop/Downloads/"  
todir="/Users/Desktop/Documents Share/Downloaded/${2}/"

rename_files() {
   title="${1##*${2} - }"
   let "iters=0"
   for filename in "$1/"*.*; do
     case "${filename##*.}" in txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf)
         new_path="${todir}/${2}/${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}${1}"*; do
    rename_files "$path" "$1"
  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

脚本的最后更新(不是“特殊”的)

#!/bin/bash

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

rename_files() {
    title="${1##*${2} - }"
    exttitle="${2}"
    iters=0
    numfiles=$(ls -l "$1/"*.* | wc -l)
    for filename in "$1/"*.*; 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}${1}"*; do
    rename_files "$path" "$1"
  done
}

rename_category DOC

【问题讨论】:

    标签: bash numbers location output move


    【解决方案1】:

    试试这个(cmets 在脚本中):

    rename_files() {
        title="${1##*${2} - }"
        exttitle="${2}"
        iters=0
        numfiles=$(ls -l "$1/"*.* | wc -l)
        for filename in "$1/"*.*; 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}${1}"*; do
        rename_files "$path" "$1"
      done
    }
    
    rename_category DOC
    

    【讨论】:

    • 似乎覆盖了同一个文件。现在作为输出文件我只有/Documents Share/Downloaded/TEST/TEST_1.doc,但输出日志是moving /Users/Desktop/Downloads/DOC - TEST/Sample-doc-file-100kb.doc -> /Users/Desktop/Documents Share/Downloaded/TEST/TEST.docmoving /Users/Desktop/Downloads/DOC - TEST/Sample-doc-file-200kb.doc -> /Users/Desktop/Documents Share/Downloaded/TEST/TEST.docmoving /Users/Desktop/Downloads/DOC - TEST/Sample-doc-file-500kb.doc -> /Users/Desktop/Documents Share/Downloaded/TEST/TEST.doc
    • 运行不正常。它只创建TEST 文件夹。
    • 已更新。我删除了while 块,它没用(你检查一个不存在的文件)。并为源目录和目标目录添加了 2 个全局变量。
    • 现在试过了,但是不行:它没有创建/Downloaded/TEST文件夹;没有输出日志。附言:我使用文件夹作为更新脚本进行了测试,但实际上DownloadedDownloads 不在同一个文件夹中:它是Desktop/DownloadsDesktop/Documents Shares/Downloaded
    • 发现了问题:可能我对文件夹路径不够清楚,我现在注意到在你的脚本中 fromdir 和 todir 是相反的(下载是文件所在的位置,而不是下载文件所在的位置)。所以,非常感谢,你解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2018-03-13
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多