würde Ich mag Kleindateinamen ändern, mit awk/sed/bash in GroßbuchstabenKleindateinamen ändern mit awk in Großbuchstaben, sed oder bash
Ihre Hilfe geschätzt
aaaa.txt
vvjv.txt
acfg.txt
gewünschte Ausgangs
würdeAAAA.txt
VVJV.txt
ACFG.txt
würde Ich mag Kleindateinamen ändern, mit awk/sed/bash in GroßbuchstabenKleindateinamen ändern mit awk in Großbuchstaben, sed oder bash
Ihre Hilfe geschätzt
aaaa.txt
vvjv.txt
acfg.txt
gewünschte Ausgangs
würdeAAAA.txt
VVJV.txt
ACFG.txt
PREFACE:
Wenn Sie über den Fall Ihrer Erweiterungen nicht kümmern, verwenden Sie einfach die ‚tr‘ Dienstprogramm in einer Shell-Schleife:
for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done
Wenn Sie über den Fall der Erweiterungen ist es egal, dann sollten Sie sich bewusst sein, dass Es gibt mehrere Möglichkeiten, dies zu tun (TIMTOWTDI). Persönlich glaube ich, dass die hier aufgeführte Perl Lösung wahrscheinlich die einfachste und flexibelste Lösung unter Linux ist. Wenn Sie mehrere Dateierweiterungen haben, geben Sie einfach die Nummer an, die Sie unverändert lassen möchten. Die BASH4 Lösung ist auch eine sehr gute, aber Sie müssen bereit sein, die Erweiterung ein paar Mal zu schreiben oder alternativ eine andere Variable zu verwenden, um es zu speichern. Aber wenn Sie ernsthafte Portabilität benötigen, dann empfehle ich die letzte Lösung in dieser Antwort, die Oktale verwendet. Einige Varianten von Linux werden auch mit einem Tool namens , das umbenennen kann, ausgeliefert, das sich ebenfalls sehen lassen kann. Die Verwendung variiert von Distro zu Distro. Geben Sie man rename
ein, um weitere Informationen zu erhalten.
SOLUTIONS:
Mit Perl:
# single extension
perl -e 's/\.[^\.]*$/rename $_, uc($`) . $&/e for @ARGV' *.txt
# multiple extensions
perl -e 's/(?:\.[^\.]*){2}$/rename $_, uc($`) . $&/e for @ARGV' *.tar.gz
Mit BASH4:
# single extension
for i in *.txt; do j="${i%.txt}"; mv "$i" "${j^^}.txt"; done
# multiple extensions
for i in *.tar.gz; do j="${i%.tar.gz}"; mv "$i" "${j^^}.tar.gz"; done
# using a var to store the extension:
e='.tar.gz'; for i in *${e}; do j="${i%${e}}"; mv "$i" "${j^^}${e}"; done
Mit GNU awk:
for i in *.txt; do
mv "$i" $(echo "$i" | awk '{ sub(/.txt$/,""); print toupper($0) ".txt" }');
done
Mit GNU sed:
for i in *.txt; do
mv "$i" $(echo "$i" | sed -r -e 's/.*/\U&/' -e 's/\.TXT$/\u.txt/');
done
Mit BASH3.2:
n.b. sed Lösung nicht kompatibel mit Mac/Darwin/BSD (nicht-Linux?) * sed * – Orwellophile
@ Orwellophile: GNU sed ist nicht BSD sed. BSD ist Linux wie GNU ist Linux. – Steve
Es funktioniert auch nicht mit Solaris. (Das ist SYSV). Aber deine Korrektur wird notiert. Es funktioniert nicht mit Nicht-GNU-Versionen von ** sed ** – Orwellophile
Im Allgemeinen für Kleinbuchstaben/Großbuchstaben-Modifikationen "tr" (übersetzen Zeichen) Dienstprogramm wird oft verwendet, es ist aus der Reihe von Befehlszeilen-Dienstprogramme für den Zeichenersatz verwendet.
dtpwmbp:~ pwadas$ echo "xxx" | tr '[a-z]' '[A-Z]'
XXX
dtpwmbp:~ pwadas$
Zum Umbenennen von Dateien gibt es auch das Dienstprogramm "rename", das mit perl (man rename) geliefert wird.
SYNOPSIS
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
DESCRIPTION
"rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in
Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line,
filenames will be read via standard input.
For example, to rename all files matching "*.bak" to strip the extension, you might say
rename 's/\.bak$//' *.bak
To translate uppercase names to lower, you'd use
rename 'y/A-Z/a-z/' *
for f in *.txt; do
mv "$f" "`tr [:lower:] [:upper:] <<< "${f%.*}"`.txt"
done
Das wird die "TXT" Erweiterung kapitalisieren. Verwenden Sie auch hier einen String: 'tr [: oberer] [: lower:] <<<" $ f "' –
@glennjackman Guter Punkt. '$ {f%. *}' sollte sich darum kümmern. Fest. –
Bash 4 Parameter Expansion kann Fall durchführen ändert:
for i in *.txt; do
i="${i%.txt}"
mv "$i.txt" "${i^^?}.txt"
done
bash:
for f in *.txt; do
no_ext=${f%.txt}
mv "$f" "${no_ext^^}.txt"
done
Dies könnte für Sie arbeiten (GNU sed):
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /' | sh
oder einfacher:
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /e'
Ich würde rename
vorschlagen verwenden, wenn Sie den Dateinamen und nicht die Erweiterung in Großbuchstaben wollen, so etwas wie folgt verwenden:
rename -n 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
\U
uppercases alles bis \E
finden perlreref(1). Entfernen Sie die -n
wenn Sie mit der Ausgabe zufrieden sind.
Sie können^und $ Anker hinzufügen und explizit das '.' Verlangen, so dass die Übereinstimmung nicht davon abhängt, ob der Regex-Abschnitt gierig oder faul ist. macht es nur lesbarer IMHO. –
Das passt besser zu dem, was das OP will. Ich habe deine Vorschläge hinzugefügt – Thor
Ein einfacher, leicht und handlich Ansatz wäre:
for i in *.txt
do
fname=$(echo $i | cut -d"." -f1 | tr [a-z] [A-Z])
ext=$(echo $i | cut -d"." -f2)
mv $i $fname.$ext
done
Diese fast jede Version von BASH arbeiten würde, da wir am häufigsten externen Dienstprogramme verwenden (Schnitt, tr) auf jedem Unix Geschmack gefunden.
einfach verwenden (auf Terminal):
for i in *.txt; do mv $i `echo ${i%.*} | tr [:lower:] [:upper:]`.txt; done;
for i in *.jar; do mv $i `echo ${i%} | tr [:upper:] [:lower:]`; done;
das für mich arbeitet.
1.Ich habe diese Tipps verwendet, um meine witzigen Dateinamen mit einem Bash-One-Liner zu ändern: für i in ./*.*; do mv "$ i" "$ (echo" $ i "| tr '[:? = &]' [_] ')"; erledigt ; 2. Querverweis fyi, um sogar mit sonderbaren Unicode-Zeichen umzugehen: http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile