Wie kann ich führende/nachgestellte Leerzeichen aus Dateinamen in Automator entfernen?

Meine Frau benennt Dateien beim Speichern auf ihrem externen Backup-Speicher ständig mühsam um, also habe ich untersucht, ob ich Automator verwenden kann, um dies für sie zu tun. Ich habe jetzt einen Automator-Ordner, in dem sie die Datei einfach dort ablegt und die Datei entsprechend umbenennt.

Ich bin jetzt mit einer Situation konfrontiert, in der die Datei möglicherweise führende und/oder nachgestellte Leerzeichen enthält. Wie kann ich diese Leerzeichen einfach kürzen?

Ich habe AppleScript noch nie wirklich verwendet, bin aber mit Shell-Skripten vertraut. Kann ich einfach ein Shell-Skript schreiben, das diese Aufgabe erfüllt? Ich werde AppleScript ausprobieren, wenn mich jemand in die richtige Richtung weisen könnte.

Schreiben Sie einfach ein Shell-Skript, das dies tut, wie Sie vorgeschlagen hatten, und in Automator können Sie Shell-Skripts ausführen. Suchen Sie in Automator nach Run Shell Script.
Ich wollte auch nachlaufende Leerzeichen aus der Datei superuser.com/questions/405127/… entfernen.

Antworten (5)

for f in "$@"; do new="$(echo -n "$f" | sed -E 's|/$||;s| +$||;s|^ +||;s|/ +([^/]+$)|/\1|;s| +(\.[^.][a-zA-Z0-9.]*)$|\1|g')"; mv "$f" "$new"; echo "$new"; done

(Als Aktion „Shell-Skript ausführen“ einfügen und Eingabe übergeben: als Argumente auswählen .)

Interessant, mir gefällt, wie Sie die Variablennamen in meinem geändert haben, um es leichter lesbar zu machen, aber Sie haben in Ihrem alles in eine einzige Regex gesteckt. Eine Sache, die Sie möglicherweise berücksichtigen müssen, ist, dass wir nicht möchten, dass Leerzeichen aus vorhandenen Pfaden entfernt werden, obwohl sie nicht vorhanden sein sollten, was tatsächlich dazu führen würde, dass das Automator-Skript fehlschlägt.
Ah, warte, mein Fehler, du eroberst nur das letzte / in der Gruppe. Okay, du hast gewonnen :)
Ändern Sie Ihre Regex in diese. s|/$||;s| +$||;s|^ +||;s|/ +([^/]+$)|/\1|;s| *\. *([^\.]+)$|\.\1|;Wir können andere Zeichen in der Erweiterung zulassen und wir möchten auch nicht, dass die Erweiterung mit einem Leerzeichen beginnt.
s| *\. *([^.]+)$|\.\1|würde EOL + . + LF.plistdurch ersetzen EOL +.+ LF.plist. Es würde keinen Einfluss haben some .tar.gz.
Punkt angemerkt, obwohl Ihre Regex dies auch nicht tut. Tatsächlich scheint das zusätzliche Punktzeichen vor der Gruppenaufnahme fehlerhaft zu sein, da es ein Leerzeichen durch einen Punkt ersetzt ( some .tar.gzwird some..tar.gz). Das Entfernen des Punkts funktioniert, verhindert aber nicht, dass das Leerzeichen in der Erweiterung am Anfang erscheint. Es genügt zu sagen, dass es nicht allzu wichtig ist, diese Dinge sind trivialer und können für immer in Frage gestellt werden.
@BrettRyan Oh, ich habe diesen zusätzlichen Punktfehler behoben.

Dafür gibt es ein Zeilenskript, cd in diesen Ordner und ...

for f in *; do mv "$f" "$(echo $f)"; done

Fügen Sie es in ein Shell-Skript ein und rufen Sie es von Applescript aus auf:

tell application "Terminal"
    do script "whatever"
end tell
Dies funktioniert nur für Dateinamen mit 4 führenden Leerzeichen :-(
für f in *; do mv "$f" " echo $f | cut -b 1-"; getan Mann geschnitten
for f in *; do mv "$f" "$(echo $f)"; donecuthat dann überhaupt nichts damit zu tun .
Danke Leute, aber wie funktioniert das? Würde Automator das Skript nicht mit einem Argument der Dateien aufrufen? Wäre nicht for f in "$@"; do echo mv "$f" "$(echo $f)" ; donepassender?
@BrettRyan: *bezieht sich auf jede Datei (oder jedes Verzeichnis) in der pwd, also ist nichts Ausführlicheres erforderlich. echoWenn Sie dies tun, stellen Sie außerdem sicher, dass Sie das in nicht do echo mv "$f"wie in Ihrem Kommentar verwenden, da Sie sonst nur echodas tun, was Sie tun möchten, anstatt es tatsächlich zu tun.
@TuanAnhTran - Sie können den Einzeiler wie folgt vereinfachen:for f in *; do mv "$f" $f; done
@frozenwithjoy: Dies schlägt fehl, wenn $f auch Leerzeichen dazwischen enthält, zB " foo bar ".
@frozenwithjoy - Ja, aber wenn Sie möchten, dass es nur auf neue Elemente wirkt, die in den Ordner verschoben wurden, und nicht auf vorhandene, sollten Sie *. Das richtige Skript wäre eigentlich so, wie ich es erwähnt habe, aber mit einem Extra echodes resultierenden Dateinamens als Standard, um alle anderen Aktionen in der Aktionskette beizubehalten/zuzulassen, ohne dass nichts in die nächste Aktion einfließen würde.
Bitte sehen Sie sich meine Antwort an, worauf ich mich festgelegt habe

Für eine korrekte Antwort, die auf der Antwort von Tuan basiert, wird Folgendes benötigt, wodurch nicht nur die Datei umbenannt wird, sondern auch die Aktionskette für nachfolgende Aktionen erhalten bleibt.

Beachten Sie auch, dass wir den übergeordneten Ordner in keiner Weise umbenennen möchten, sondern nur die Dateien.

for f in "$@" ; do
    dirname=$(dirname "$f")
    basename=$(basename "$f")
    name=${basename%.*}
    ext=${basename##*.}
    name="$(echo "$name" | sed -Ee 's/^ +//;s/ +$//')"
    new="$dirname/$name.$ext"
    mv "$f" "$new"
    echo "$new"
done

Sie müssen dies auch nicht in ein Shell-Skript selbst einfügen, Automator kann dies in die Aktion "Run Shell Script" einbetten.

Ich wollte auch nachlaufende Leerzeichen aus Datei- und Ordnernamen entfernen. Dieser Super-User-Beitrag hat mir geholfen.

Es gibt ein AppleScript (sehr ähnlich zu Automator), das Dateinamen kürzt. Es ist ein bisschen lang, also kann ich es hier nicht posten, aber hier ist ein Link zum Code. Stellen Sie sicher, dass Sie den Anfang des Codes lesen, da er erklärt, was das Skript macht und wie es funktioniert.

Hab mir das Drehbuch angeschaut, jetzt weiß ich nicht ob ich lachen oder weinen soll...