2016-08-12 5 views
0

Ich bin hier aus Optionen laufen ..Bash-Skript - alle Dateien in einem Verzeichnis umbenennen * Raum * enthält() * -

hatte ich einen Blick auf die verschiedenen Beiträge hier über das Thema, aber aus irgendeinem Grund Die Antworten funktionierten nicht für mich.

Ich möchte ein einfaches Skript, um alle Dateien in einem bestimmten Ordner in alles umzubenennen! sag einen Zähler nr. dh:

1.jpg

2.pdf

3.exe

Ich brauche dies für einen Teil von meinem Skript, da ich nicht die Dateien verschieben können, da diese Sonderzeichen :

Ich benutze cygwin auf einem win7 Maschine Werden die Dateien von win7 dh erstellt:

test01.jpg 
test01 (2).jpg 
test01 (2) - Copy.jpg 

Dies ist der Teil des Skripts, die ich brauche, damit es funktioniert: Ich wollte nur

pathF="d:/scripts/img/_sandbox/depFrom" 
searchAll=$(find $pathF -type f | egrep ".*") 
ct=0 
for fAll in $searchAll; do 
    # echo -e $fAll 
    # echo -e "$ct" 
    old=$fAll 
    # new=$(sed "s/\ //g" $fAll) 
    mv -v $old $ct #$new 
    ((ct++)) 
done 

In diesem Beispiel behandeln Räume, aber ich muss mit() - und Leerzeichen umgehen, um alle zu decken. Diese

ist die Ausgabe in meiner Konsole: output Aus irgendeinem Grund scheint es zu stoppen/Split im Raum zwischen und nach der Erweiterung.

Jede Hilfe wird sehr geschätzt.

============================================== ====================

EDIT: habe ich versucht, dies:

pathF="d:/scripts/img/_sandbox/depFrom" 
searchAll=$(find $pathF -type f -printf "%f\n") 
for fAll in $searchAll; do 
    echo -e $fAll 
done 

Und der Ausgang ist dies:

test01 
(2) 
- 
Copy.jpg 

Es gibt nur eine Datei im Ordner !!

$ ls depFrom/ 
test01 (2) - Copy.jpg 

$ find depFrom/ -type f -printf "%f\n" 
test01 (2) - Copy.jpg 
+1

'x = 0; für i in * .jpg; mach mv" $ i "$ ((++ x)). Jpg; done'? – 123

+0

Ich habe das gleiche Ergebnis, dies würde nur den Namen der Datei erhöhen. Das Problem scheint darin zu liegen, die Dateien zu lesen. –

+0

Es gibt so viele Race Conditions, die Sie nicht einmal in Betracht gezogen haben, die eine zuverlässige Lösung fast unmöglich machen. Aber warum fragst du nicht stattdessen nach dem [kurzen Dateinamen] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx#short_vs._long_names)? Es enthält garantiert keine Leerzeichen. – IInspectable

Antwort

1

enthalten könnte Dies sollte so lange arbeiten, wie die Dateinamen nicht enthalten Zeilenumbrüche.

pathF="d:/scripts/img/_sandbox/depFrom" 
counter=0 
find "$pathF" -type f | while read f; do 
    mv "$f" "$((++counter))${f/*\./.}" #increment counter, preserve extension 
done 

Wenn Sie nicht eine rekursive Suche nach pathF benötigen, dann wird die Lösung in 123 Kommentar unter Ihrer ursprünglichen Frage vorgelegt sollte für Sie arbeiten, wenn Sie die Erweiterung hinzufügen aus der Liste meiner Antwort Erhaltung Code:

x=0;for i in *;do mv "$i" "$((++x))${i/*\./.}";done 
+0

Dies schien zu arbeiten, ich denke, das Bit: $ {f /*./.} Tat den Trick. Vielen Dank! –

1

das Problem ist bereits in der Ausgabe von finden. Jeder Raum wird von den folgenden Befehlen als Trennung betrachtet. Sie sollten die Option

-print0 
      True; print the full file name on the standard output, followed by a null character 
      (instead of the newline character that -print uses). This allows file names that 
      contain newlines or other types of white space to be correctly interpreted by pro‐ 
      grams that process the find output. This option corresponds to the -0 option of 
      xargs. 

Zusätzlich verwenden, sollten Sie die richtige Apostroph verwenden, wenn Sie einen Dateinamen verwenden, dass einen Raum

mv -v "$old" "$ct" 
+0

Ich habe Ihren Vorschlag versucht, kein Glück .. sehen Sie die EDIT –

Verwandte Themen