it-swarm.com.de

Linux benennt Dateien in Großbuchstaben um

Ich habe eine große Anzahl von Dateien im Format x00000.jpg, X00000.jpg und xx00000.jpg.

Wie kann ich diese Dateien umbenennen, damit sie alle in Großbuchstaben geschrieben werden und den numerischen Teil des Namens ignorieren?

20
Jay
for f in * ; do mv -- "$f" "$(tr [:lower:] [:upper:] <<< "$f")" ; done
21
damienfrancois

Sie können Dateien nicht nur in Bash umbenennen, da Bash keinen integrierten Befehl zum Umbenennen von Dateien enthält. Sie müssen dafür mindestens einen externen Befehl verwenden.

Wenn Perl erlaubt ist:

Perl -e 'for(@ARGV){rename$_,uc}' *.jpg

Wenn Python erlaubt ist:

python -c 'import os, sys; [os.rename(a, a.upper()) for a in sys.argv[1:]]' *.jpg

Wenn Sie über Tausende oder mehr Dateien verfügen, sind die oben genannten Lösungen schnell und die folgenden Lösungen deutlich langsamer.

Wenn AWK, ls und mv zulässig sind:

# Insecure if the filenames contain an apostrophe or newline!
eval "$(ls -- *.jpg | awk '{print"mv -- \x27"$0"\x27 \x27"toupper($0)"\x27"}')"

Wenn Sie über viele Dateien verfügen, funktionieren die oben genannten Lösungen nicht, da *.jpg zu einer zu langen Argumentliste erweitert wird (Fehler: Argumentliste zu lang).

Wenn tr und mv erlaubt sind, dann sehen Sie die Antwort von damienfrancois.

Wenn mv zulässig ist:

for file in *; do mv -- "$file" "${file^^}"; done

Bitte beachten Sie, dass diese am Ende .jpg in .JPG umbenannt werden. Sie können sie jedoch ändern, um dies zu vermeiden.

12
pts

Die bash-Shell verfügt über eine Syntax zum Übersetzen eines Variablennamens in Großbuchstaben.

for file in * ; do      # or *.jpg, or x*.jpg, or whatever
    mv $file ${file^^}
done

Ich denke, dass dies eine ziemlich neue Funktion sein kann, vergewissern Sie sich zunächst, dass Ihre Version von bash sie implementiert. Um Fehler zu vermeiden, versuchen Sie es einmal, mv durch echo mv zu ersetzen, nur um sicherzustellen, dass es das tut, was Sie wollen.

Die Dokumentation für diese Funktion lautet here oder geben Sie info bash ein und suchen Sie nach "upper".

Sie sollten wahrscheinlich entscheiden, was zu tun ist, wenn die Zieldatei bereits vorhanden ist (beispielsweise, wenn x00000.jpg und X00000.JPG bereits vorhanden sind), sofern Sie nicht sicher sind, dass es sich nicht um ein Problem handelt. Um solche Namenskollisionen zu erkennen, können Sie Folgendes versuchen:

ls *.txt | tr '[a-z]' '[A-Z]' | sort | uniq -c | sort -n

und suche nach Zeilen, die nicht mit 1 beginnen.

8
Keith Thompson

Die Kombination vorheriger Antworten könnte ergeben:

for file in * ; do            # or *.jpg, or x*.jpg, or whatever
   basename=$(tr '[:lower:]' '[:upper:]' <<< "${file%.*}")
   newname="$basename.${file#*.}"
   mv "$file" "$newname"
done
7
Wiley

Mit tr:

f="x00000.jpg"
n="${f%.*}"
n=$(tr '[:lower:]' '[:upper:]' <<< "$n")
f="$n.${f#*.}"
echo "$f"

AUSGABE:

X00000.jpg
3
anubhava

rename

Am einfachsten ist es wahrscheinlich, mehrere Dateien zu rename zu machen. Um Kleinbuchstaben in Großbuchstaben zu übersetzen, würden Sie:

rename 'y/a-z/A-Z/' *

Verweise

2
Pablo Bianchi

Wenn Sie nur die Dateien/Verzeichnisse umbenennen möchten, können Sie rnm verwenden:

rnm -rs '/./\C/g' -fo -dp -1 *

Erläuterung:

  1. -rs: String ersetzen. /./\C/g ersetzt alle Übereinstimmungen von . (Regex) in Großbuchstaben.
  2. -fo: Nur-Datei-Modus
  3. -dp: Tiefe des Verzeichnisses (-1 bedeutet unbegrenzt).

Weitere Beispiele finden Sie hier .

0
Jahid