2016-03-22 16 views
0

Ich versuche zu verstehen, wie ich das Skript ändern kann, so dass die Ausgabedateien sind nicht TEST.doc, TEST.doc1, TEST.doc12, ect, sondern TEST.doc, TEST_1.doc, TEST_2.doc, usw. Einfacher, direkt vor spezifischen spezifischen .extension. (txt|rtf|pages|numbers|keynote|doc|docx|xls|ppt|pdf).Bash -. Verschieben Sie eine Zahl in eine bestimmte Zeichenfolge Lage

Wie kann ich das tun?

Hier das Skript

#!/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 

EDIT:

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 

Bevor:

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

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

Nach:

/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:

Es gibt zwei Testdateien: big_buck_bunny_240p_50mb.mp4 und big_buck_bunny_240p_50mb copy.mp4

Das Ausgabeprotokoll

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:

Letzte Aktualisierung des Skripts (nicht die "spezielle")

#!/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 

Antwort

1

Versuchen Sie, diese (Kommentare im Skript sind):

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 
+0

Es scheint, die gleiche Datei zu überschreiben. Als Ausgabedatei habe ich jetzt nur '/ Dokumente Share/Downloaded/TEST/TEST_1.doc', aber das Ausgabeprotokoll ist' moving/Benutzer/Desktop/Downloads/DOC - TEST/Sample-doc-file-100kb.doc ->/Benutzer/Desktop/Dokumente teilen/heruntergeladen/TEST/TEST.doc' 'Umzug/Benutzer/Desktop/Downloads/DOC - TEST/Beispiel-doc-Datei-200kb.doc ->/Benutzer/Desktop/Dokumente teilen/heruntergeladen/TEST/TEST.doc' 'Verschieben/Benutzer/Desktop/Downloads/DOC - TEST/Beispiel-doc-Datei-500kb.doc ->/Benutzer/Desktop/Dokumente teilen/heruntergeladen/TEST/TEST.doc'. – DylanDog

+0

Ich aktualisierte Protokollnachricht und 'while' Block. – SLePort

+0

Es läuft nicht richtig. Es erstellt nur 'TEST'-Ordner. – DylanDog

Verwandte Themen