Einer der grundlegenden Unterschiede zwischen Windows cmd
und POSIX-Shells ist für Wildcard-Erweiterungen verantwortlich. Shells führen alle erforderlichen Erweiterungen durch, bevor sie die eigentlichen Befehle starten, nach denen Sie gefragt haben. cmd
meistens übergibt die Platzhaltermuster unverändert an die Befehle. (Ich sage hauptsächlich, da ich denke, dass es Ausnahmen gibt und Umgebungsvariablen unter den meisten Umständen erweitert werden.) Dies macht das Schreiben eines rename
das würde mit der gleichen Syntax wie in cmd
funktionieren ziemlich knifflig.
Aber es gibt eine rename
für Linux - mit völlig anderen Argumenten, sehen Sie sich die Manpage an (die auf meinem System etwas knapp ist, und rename
stammt aus dem util-linux
Paket auf meinem System, das allgemein verfügbar sein sollte). Ihre erste Umbenennung würde folgendermaßen erfolgen:
rename .txt .bak *.txt
Beachten Sie, dass die Shell den *
ausführt Erweiterung, also rename
selbst denkt tatsächlich, dass es so aufgerufen wurde:
rename .txt .bak file1.txt file2.txt file3.txt ...
So können Sie die Einzeldateiversion erraten:
rename .txt .bak file1.txt
Wenn Sie rename
nicht verwenden möchten aber implementieren Sie dies selbst, Sie könnten eine Funktion dafür erstellen. Angenommen, Sie möchten nur die Dateierweiterung ändern und zum Umbenennen einzelner Dateien sehen Sie sich Folgendes an:
$ function chext() {
newext="$1"
file="$2"
newfile="${file%.*}$newext"
echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv
$newfile
wird unter Verwendung einer Teilstringentfernung erstellt, um die ursprüngliche Erweiterung zu entfernen, und verkettet dann die neue Erweiterung. Sie können diese Funktion relativ einfach erweitern, um mehrere Dateien zu verwalten.
Wie für Ihren ls
Frage, verwenden Sie den -d
Schalter. Dadurch wird ls
verhindert vom Auflisten des Inhalts von Verzeichnissen.
Demo:
$ ls -al
total 536
drwx------ 3 owner users 528384 Jan 7 17:29 .
drwxr-xr-x 126 owner users 12288 Jan 7 17:26 ..
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f1.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f2.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f3.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f4.csv
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Wildcard-Umbenennung
$ rename .csv .txt f*
$ ls -al
total 536
drwx------ 3 owner users 528384 Jan 7 17:34 .
drwxr-xr-x 126 owner users 12288 Jan 7 17:26 ..
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f1.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f2.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f3.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f4.txt
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Umbenennung einzelner Dateien
$ rename .txt .csv f1.txt
$ ls -al
total 536
drwx------ 3 owner users 528384 Jan 7 17:34 .
drwxr-xr-x 126 owner users 12288 Jan 7 17:26 ..
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f1.csv
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f2.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f3.txt
-rw-r--r-- 1 owner users 0 Jan 7 17:28 f4.txt
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Der Standard ls
$ ls -l t*
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
test:
total 0
-rw-r--r-- 1 owner users 0 Jan 7 17:33 dont_show_me_please
ls
das keine Verzeichnisse inspiziert
$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan 7 17:33 test
-rw-r--r-- 1 owner users 0 Jan 7 17:27 test.csv
Eine Sache, die Sie bei Platzhaltern beachten sollten, ist, dass sie durch die Shell erweitert werden. Die Anwendung weiß nicht, ob Sie Platzhalter verwendet oder die Namen eingetippt haben. Zum Beispiel, wenn Sie rename *.txt *.bak
eingeben , dann rename
Befehl sieht so etwas wie rename file1.txt file2.txt existingfile.bak
. Das sind nicht genug Informationen, um fortzufahren.
Ich werde mich mit der Frage zu ls
befassen Erstens, weil es einfacher ist. Wenn Sie nur die übereinstimmenden Namen wollen, brauchen Sie ls
nicht , da die Shell bereits die Erweiterung durchführt.
echo t*
Wenn Sie weitere Informationen zu den Dateien wünschen, übergeben Sie den -d
Option zu ls
, um ihm mitzuteilen, den Inhalt von Verzeichnissen nicht aufzulisten.
ls -ld t*
Es gibt kein Standardprogramm zum Umbenennen von Dateien, weil die ersten Unix-Systeme noch keins hatten. Die portable Methode zum Umbenennen von Dateien verwendet eine Schleife und ist etwas ausführlich:
for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done
Es gibt mehrere gängige Dienstprogramme zum Umbenennen von Dateien, von denen keines garantiert auf einem bestimmten Unix-System installiert ist, aber alle einfach zu installieren sind. Hier sind die wichtigsten:
-
rename
aus demutil-linux
Suite, die auf jedem nicht eingebetteten Linux-System (und nirgendwo sonst) verfügbar ist. Unter Debian und Derivaten (einschließlich Ubuntu) heißt dieser Befehlrename.ul
. Vorausgesetzt, dass.txt
nicht vorkommt Abgesehen von der endgültigen Erweiterung können Sierename .txt .bak *.txt
-
rename
ist ein Perl-Skript, das Debian und Derivate als/usr/bin/rename
ausliefern . Sie können Dateien nach beliebigen Perl-Befehlen umbenennen.rename 's/\.txt\z/\.bak/' *.txt
-
mmv
, das Dateien nach mehreren namensbasierten Mustern umbenennen, kopieren und verknüpfen kann und über viele Optionen verfügt, was passiert, wenn ein Zielname bereits vorhanden ist. Beachten Sie, dass Sie Anführungszeichen verwenden müssen, um Platzhalter vor der Erweiterung durch die Shell zu schützen.mmv '*.txt' '#1.txt'
-
zmv
ist eine zsh-Funktion, die genau dann verfügbar ist, wenn Ihre Shell zsh ist. Es kann beliebige zsh-Muster abgleichen (Sie können also Dateinamen nach beliebigen regulären Ausdrücken abgleichen, nicht nur mit Platzhaltern, und Sie können Dateien nach anderen Kriterien wie Datum und Größe abgleichen).zmv
kann auch kopieren und verlinken.zmv '(*).txt' '$1.txt'
Wenn Sie eine gewisse Kontrolle über die von Ihnen verwendeten Maschinen haben, empfehle ich, zsh als Ihre Shell zu verwenden (sie hat andere Vorteile gegenüber bash) und diese Zeilen in Ihren ~/.zshrc
einzufügen :
autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'
noglob
ist eine zsh-Funktion, die die Shell anweist, keine Platzhalter im Argument des Befehls zu erweitern. Auf diese Weise können Sie zmv *.txt \$1.txt
schreiben (Sie müssen immer den $
schützen in einem Ersetzungstext).