2016-07-03 12 views
4

ich bin ein total noob, aber ich dachte, dieses Skript aus, um die folgenden Aktionen ausführen:Bash-Skript Optimierung Datei umbenennen

Ich habe einen Ordner „unrar“ genannt da drin sind Unterordner mit unbekanntem folder mit rar innen Datei. Nun trete ich ein unbekanntes Unterverzeichnis ein, finde rar und trenne es in unknownsubfolder. Danach finde ich die neue Datei und benenne sie mit dem unknownsubfoldername um. Jetzt schnappe ich mir die Datei und verschiebe sie nach ./unrar.

#!/bin/bash 

cd /home/user/unrar/ 

for dir in /home/user/unrar/*; 
    do (cd "$dir" && find -name "*.rar" -execdir unrar e -r '{}' \;); done 

echo "$(tput setaf 2)-> unrar done!$(tput sgr0)" 

for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mkv" -exec mv '{}' "${PWD##*\/}.mkv" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.mp4" -exec mv '{}' "${PWD##*\/}.mp4" \;);  done 
for dir in /home/user/unrar/*; 
do (cd "$dir" && find -name "*.avi" -exec mv '{}' "${PWD##*\/}.avi" \;); done 

cd /home/user/unrar 
find -name "*.mkv" -exec mv '{}' /home/user/unrar \; 
find -name "*.mp4" -exec mv '{}' /home/user/unrar \; 
find -name "*.avi" -exec mv '{}' /home/user/unrar \; 

Dies funktioniert mit den meisten Dateien, aber in einigen Fällen tut es nicht

I * .rar in DIR und unrar es finden wollen. Die neue Datei. (. mkv | .avi | .mp4) sollte umbenannt werden in DIR (.mkv | .avi | .mp4) und nach ./unrar verschoben werden

Dies ist meine Dateistruktur.

./unrar/ 
    - unknownsubfolder/ 
     -file.rar 
     -file.r00 
     -.... 
    - unknownsubfolder1/ 
     - s01/ 
      - file.rar 
      - file.r00 
      - .... 
     - s02/ 
      - file.rar 
      - file.r00 
      - .... 
     - .... 

Wenn case1, unrar "/unknownsubfolder/file.rar" und erhalten "x.mkv". die Datei von "x.mkv" auf "unknwonsubfolder.mkv" umbenannt und verschoben "./unrar/unknownsubfolder.mkv" (gleiche mit * .avi + * .mp4) == perfekt

wenn case2, In meinem Skript unknownsubfolder/s01/file.rar wird unrard, aber nicht in s01.mkv in unknwonsubfolder1.mkv umbenannt. (wenn es mehr wie s02 ist, s03, s04 ...) ich immer mit einer unknownsubfolder.mkv Datei in ./unrar am Ende) == falsche Ausgabe

Also ich denke, ich habe 3 Fragen

Wie bekomme ich den richtigen Namen für die Umbenennung der Datei? Oder wie gebe ich unknownsubfolder/s01 .... ein?

Gibt es eine Möglichkeit, ein Wort vom Fund auszuschließen? manchmal enthält "unknownsubfolder" einen anderen Ordner + Datei namens "sample (.mkv | .avi | .mp4)". Ich möchte das ausschließen, um zu verhindern, dass die Originaldatei mit der Beispieldatei überschrieben wird. passiert manchmal.

Ich bin sicher, dass ich einige der Code kombinieren kann, um es noch kürzer zu machen. Könnte jemand erklären, wie? So, wie ich die mkv, avi und mp4 in einer Linie kombiniere.

Grüßen, wombat

(EDIT: zum besseren Verständnis)

+0

Verstehe ich richtig, in dem problematischen Fall haben Sie 30 Unterordner in unknownsubfolder statt einer RAR-Datei? Wie Sie es formuliert haben, könnte man meinen, dass es nur ein Ordner namens 'subfolder1-30' ist. Haben diese Unterordner immer noch nur eine einzige RAR-Datei? – nautical

+0

Rechts, Unterordner unbekannt enthält bis zu 30 weitere Unterordner, die jeweils ein komprimiertes Video in rar enthalten. – wombat

Antwort

2

UPDATE:

eingestellt ich die Lösung mit unrar zu arbeiten. Da ich zuvor unrar nicht installiert hatte, habe ich gunzip verwendet, um die Lösung zu erstellen, und dann einfach durch unrar ersetzt. Das Problem bei diesem Ansatz bestand darin, dass unrar standardmäßig in das aktuelle Arbeitsverzeichnis extrahiert wird. Ein weiterer Unterschied ist, dass der Name der extrahierten Datei vom Namen des Archivs völlig abweichen kann - es handelt sich nicht nur um verschiedene Erweiterungen. Das Originalarchiv wird auch nach der Extraktion nicht gelöscht.

Hier ist die Lösung, die speziell mit unrar in Bezug auf oben genannte Verhalten arbeiten zugeschnitten:

#!/bin/bash 

path="$1" 
omit="$2" 

while read f;do 
     unrar e -r "${f}" "${f%/*}" > /dev/null 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -print) 

while read f;do 
     new="${f%/*}" 
     new="${new##*/}" 
     mv "${f}" "${path}/${new}" 
done < <(find "${path}" -type d -name "${omit}" -prune -o -type f -a \! -name '*.rar' -print) 

Sie das Skript speichern, zum Beispiel, Wie rename-script (vergessen Sie nicht, es ausführbar zu machen), und dann rufen wie

./rename-script /path/to/unrar omitfolder 

Beachten Sie, dass im Skript gibt es keine cd. Sie müssen mindestens den Speicherort des Unrar-Ordners als ersten Parameter angeben, sonst erhalten Sie einen Fehler. Im Fall von OP wäre dies /home/user/unrar. Die omitfolder ist nicht ein Pfad, es ist nur der Name des Ordners, den Sie weglassen möchten. In OPs Fall wäre das also sample.

./rename-script /home/user/unrar sample 

Wie OP in den Kommentaren aufgefordert, können Sie das lesen über bash read-builtin und process substitution, um zu verstehen, wie die while -loop funktioniert und wie es die Dateinamen von find auf die Variable f zurück zuweist.

+0

Vielen Dank für Ihre Antwort. Im Moment verstehe ich nichts, aber ich werde versuchen, es herauszufinden, was macht was und kommt mit besserem Feedback zurück. – wombat

+0

Wenn ich dieses Skript ausführen, bekomme ich Syntaxfehler bei "done <<" unerwartetes Wort. Ich kann herausfinden, was jede Zeile in diesem Skript macht, aber nicht wirklich, was "lesen f" bedeutet, und dann "$ {f}". Ich denke, es ist die Datei, die ich entschlüsseln will, aber wie weiß ich, dass es die Datei ist, die man entschlüsseln soll. Könntest du das erklären? – wombat

+0

@wombat Ich habe die Lösung aktualisiert, um mit 'unrar' zu arbeiten. Ich habe 'gunzip' vorher benutzt und einfach durch' unrar' ersetzt. Ihr Fehler ist jedoch darauf zurückzuführen, dass das Skript nicht ordnungsgemäß aufgerufen wurde. Sie müssen mindestens den Speicherort des Unrar-Ordners als ersten Parameter angeben. Wenn sich Ihr unrar-Ordner immer am selben Speicherort befindet und der ausgelassene Ordner immer den gleichen Namen hat, können Sie beide in das Skript schreiben, indem Sie 'path ="/home/user/unrar "' und 'omit = sample' ändern. Dann könnten Sie es einfach ohne Parameter aufrufen. – nautical