2012-09-17 1 views
5

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ürde
AAAA.txt 
VVJV.txt 
ACFG.txt 
+0

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

Antwort

15

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:

+0

n.b. sed Lösung nicht kompatibel mit Mac/Darwin/BSD (nicht-Linux?) * sed * – Orwellophile

+0

@ Orwellophile: GNU sed ist nicht BSD sed. BSD ist Linux wie GNU ist Linux. – Steve

+0

Es funktioniert auch nicht mit Solaris. (Das ist SYSV). Aber deine Korrektur wird notiert. Es funktioniert nicht mit Nicht-GNU-Versionen von ** sed ** – Orwellophile

9

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/' * 
1
for f in *.txt; do 
    mv "$f" "`tr [:lower:] [:upper:] <<< "${f%.*}"`.txt" 
done 
+0

Das wird die "TXT" Erweiterung kapitalisieren. Verwenden Sie auch hier einen String: 'tr [: oberer] [: lower:] <<<" $ f "' –

+0

@glennjackman Guter Punkt. '$ {f%. *}' sollte sich darum kümmern. Fest. –

1

Bash 4 Parameter Expansion kann Fall durchführen ändert:

for i in *.txt; do 
    i="${i%.txt}" 
    mv "$i.txt" "${i^^?}.txt" 
done 
1

bash:

for f in *.txt; do 
    no_ext=${f%.txt} 
    mv "$f" "${no_ext^^}.txt" 
done 
0

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' 
4

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.

+0

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. –

+0

Das passt besser zu dem, was das OP will. Ich habe deine Vorschläge hinzugefügt – Thor

1

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.

1

einfach verwenden (auf Terminal):

for i in *.txt; do mv $i `echo ${i%.*} | tr [:lower:] [:upper:]`.txt; done; 
0
for i in *.jar; do mv $i `echo ${i%} | tr [:upper:] [:lower:]`; done; 

das für mich arbeitet.