Linux-Skript oder -Programm zum Verkürzen von Dateinamen

8

Ich hatte nicht viel Erfolg bei der Suche nach einer Linux-Version von namemangler , die ich umbenennen muss, damit 1000 Dateien unter Windows lesbar sind.

Kennt jemand ein Linux-Programm, das dies kann?

Wenn nicht, funktioniert ein Skript möglicherweise, da ich nur alle Dateien in einem Ordner auf die ersten 16 Zeichen umbenennen muss. Ich vermute, dass es sich lohnt, die Skriptroute zu gehen, bin mir aber nicht sicher, wo ich anfangen soll.

Grimlockz
quelle
2
Sie könnten wahrscheinlich schnell ein Python- oder Perl- oder Ocaml- oder Ruby-Skript schreiben, das dies tut.
Warum können Sie nicht einfach ein vfat-Dateisystem verwenden, das lange Dateinamen zulässt?
wnoise
2
Wie lange dauern Namen und was enthalten sie aus Neugier, damit sie von Windows nicht erkannt werden?
Bobby

Antworten:

10

Wenn Sie unter Debian, Ubuntu und Derivaten man renamean einer Eingabeaufforderung eingeben , erhalten Sie die Handbuchseite für ein Umbenennungsdienstprogramm, mit dem beliebige Perl-ähnliche Befehle für reguläre Ausdrücke beim Umbenennen verwendet werden können.

Dadurch werden beispielsweise alle Dateien im aktuellen Verzeichnis auf eine Länge von fünf gekürzt (durch Abschneiden):

rename 's/^(.{5}).*/$1/' *

Es funktioniert, indem die ersten fünf Zeichen erfasst und dann in der Ersetzung verwendet werden, wobei der Rest entfernt wird.

Ein weiteres Beispiel ist das Kürzen von Dateinamen (ohne Erweiterung) auf fünf Zeichen, wobei die Erweiterung beibehalten wird :

rename 's/^(.{5}).*(\..*)$/$1$2/' *

Es erfasst zwei Gruppen, wobei die erste die ersten fünf Zeichen und die zweite die Erweiterung ist. Dies würde sich myCarefullyCraftedDocument.pdfin verwandeln myCar.pdf.

Warnung: Verwenden Sie dies sorgfältig, vorzugsweise auf einer Kopie Ihres Verzeichnisses oder indem Sie zuerst Sicherungen erstellen. Du wurdest gewarnt!! Verwenden rename -nSie mindestens zuerst, um zu sehen, was getan werden würde, ohne es tatsächlich zu tun.


quelle
1
Wird dadurch das Präfix wie in PDF entfernt? und was würde mit gleichnamigen Dateien passieren, wenn sie einmal gekürzt würden?
Dieses besondere Beispiel wird ja. Sie können einen regulären Ausdruck schreiben, um die Erweiterung in Ruhe zu lassen. Ich werde die Antwort aktualisieren. Es schützt auch vor dem Überschreiben bereits vorhandener Dateien, sodass spätere Umbenennungen fehlschlagen.
Vielen Dank für Ihre Hilfe - ich bin sehr dankbar. Ich habe ein kleines Problem, wenn einige der PDFs in 5 umbenannt werden. Sagen wir, was würde mit den PDFs passieren, die versucht wird, sie mit demselben Namen umzubenennen? Ist dies eine Möglichkeit, wie wir einfach allen eine eindeutige Nummer hinzufügen können? siehe unten ename -n 's / ^ (. {5}). * (\ .. *) $ / $ 1 $ 2 /' * Anhänge 123114345234525.pdf umbenannt in Anhang.pdf Anhänge 123114432452352.pdf umbenannt in Anhang.pdf
@Grimlockz, ich glaube nicht, dass Sie diese Art von Intelligenz in den Umbenennungs-Regex selbst einfügen können. Möglicherweise müssen Sie ein Skript schreiben, um die Umbenennung mit dieser Art von Intelligenz zu versehen.
@Grimlockz Deshalb möchten Sie nicht alles in einem regulären Ausdruck tun . Sie sind glücklicher und besser dran, ein Skript zu schreiben, das reguläre Ausdrücke verwendet.
Spencer Rathbun
3

Sie können widersprüchliche Dateien in ein anderes Verzeichnis verschieben:

for i in *
do
    j=${i:0:16}

    if [ -e "$j" ]
    then
        mv "$i" /path/to/rename/later
    else
        mv "$i" "$j"
    fi
done
kev
quelle
1

Sie können ein Skript schreiben, um Dateinamen zu verkürzen und Zeichen, die Windows nicht mag, in wenigen Zeilen zu entfernen. Warnung, ungetesteter Code, direkt in meinen Browser eingegeben.

shopt -s dotglob extglob
for x in *; do
  y=${x//+([!-!#$%&'().0-9@A-Z^_`a-z{}~])/_}  # change all problematic characters to _
  if [[ $y = .* ]]; then y=_${y#.}; fi        # change dot files to begin with _
  y=${y:0:16}                                 # truncate names
  y=${y,,}                                    # convert to lowercase
  if [[ -e $y || $y =~ ^(aux|clock\$|com[0-9]|con|lpt[0-9]|nul|prn)(\.*)?$ ]]; then
    # The file exists or is a DOS/Windows reserved name.
    # Change foo.bar to foo~1.bar, foo~2.bar, ... (I ignore the length restriction here)
    i=1
    if [[ $y =~ \. ]]; then
      prefix=${y%%.*}; suffix=.${y#*.}
    else
      prefix=$y; suffix=
    fi
    y=${prefix}~$i$suffix
    while [[ -e $y ]]; do
      ((++i))
      y=${prefix}~$i$suffix
    done
  fi
  mv -- "$x" "$y"
done

Wenn Sie in Unterverzeichnisse zurückkehren müssen, rufen Sie ein Shell-Skript von auf find -depth -exec …. Oder verwenden Sie zsh anstelle von bash. Erweitert in zsh **/*(od)rekursiv auf alle Dateien im aktuellen Verzeichnis, wobei zuerst tiefer verschachtelte Dateien verwendet werden.

Gilles 'SO - hör auf böse zu sein'
quelle
1

Shell / Python / Perl-Skripte für diese Art von Dingen sind in Ordnung, aber es scheint, als wäre eine GUI- App am besten für Sie geeignet. Daher würde ich pyRenamer empfehlen , das unter anderem genau das tun kann, was Sie wollen (einfache allgemeine Operationen) über Voreinstellungen [Leerzeichen entfernen, Dateinamen von einem Punkt zum anderen kürzen], einfaches Suchen / Ersetzen, komplizierte Regex, Vorschau usw.).

Ihre Distribution hat es möglicherweise sogar in ihrem Software-Repository (Fedora tut es).

rsaw
quelle
0

Einige Systeme verfügen nicht über den renameBefehl. Als Alternative zur Antwort von paxdiablo erfahren Sie hier, wie Sie dasselbe tun mv.

for f in *.pdf; do 
    tmp=`echo $f | sed -r 's//^(.{5}).*(\..*)$/$1$2/'`
    mv -b ./"$f" ./"$tmp"
done

Das -bFlag beim Verschieben erstellt eine Sicherung von Dateien, die gelöscht oder überschrieben werden. Durch Ändern des Glob-Musters in der for-Schleife können Sie anpassen, auf welchen Dateien es ausgeführt wird, und es *selbst verwenden, um alle Dateien auszuführen.

Spencer Rathbun
quelle
1
Keine Notwendigkeit zu verwenden echound eine Pipe (kann sehr teuer sein, wenn Sie viele Dateien haben), verwenden Sie stattdessen einen Heredoc oder Herestring.
Chris Down
1
@ ChrisDown siehe hier . Laut dem Wiki-Artikel sind die Piped-Prozesse gegabelt, aber es sagt nichts darüber aus, sie in ihren eigenen Shells auszuführen.
Spencer Rathbun
1
Beachten Sie beispielsweise den Unterschied zwischen eval 'echo $BASH_SUBSHELL'und eval 'echo $BASH_SUBSHELL' | cat.
Chris Down
2
Ich habe gerade einen kurzen Test durchgeführt, bei dem timeeine Schleife echo $i | sedund eine andere verwendet wurden sed ... <<<$i, und der Herestring dauerte ungefähr 2/3 der Zeit des Echos.
Kevin
1
@SpencerRathbun Ja. <<Startet ein hier <i> doc </ i>, das mehrzeilig ist und Trennzeichen erfordert. <<<Erstellt hier eine <i> Zeichenfolge </ i>, die nur eine Variable / Zeichenfolge verwendet. Probieren Sie es aus var=abc // cat<<<$var // cat <<$var.
Kevin
0

Wenn Sie mit dem Umbenennen von Dateien experimentieren müssen und zufällig KDE-Bibliotheken auf Ihrem System installiert haben (oder nichts dagegen haben, sie hinzuzufügen), lesen Sie krename.

Sie können damit einige einfache Umbenennungsaufgaben direkt mit den Tools ausführen und reguläre Ausdrücke für kompliziertere Situationen verwenden.

Es zeigt Ihnen eine Vorschau der umbenannten Dateien, während Sie die Umbenennungsbedingungen erstellen. Außerdem können Sie dieselben Dateien erneut umbenennen. Dies ist hilfreich, wenn Sie etwas Kompliziertes tun möchten, bei dem eine schrittweise Ausführung die Komplexität jeder Phase auf etwas reduzieren würde, das Sie schnell herausfinden können.

Joe
quelle
-1
for file in *; do
    mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')
done &
Jairo Bernal
quelle