GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich Platzhalter im ms-dos-Stil mit ls und mv verwenden?

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 dem util-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 Befehl rename.ul . Vorausgesetzt, dass .txt nicht vorkommt Abgesehen von der endgültigen Erweiterung können Sie

    schreiben
    rename .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).


Linux
  1. So arbeiten Sie mit Benutzern und Gruppen in Linux

  2. Wie verwende ich die Ausgabeumleitung in Kombination mit Here-Dokumenten und Cat?

  3. So konfigurieren Sie SSH, um Benutzer/Gruppen mit Allow- und Deny-Anweisungen einzuschränken

  4. Wie kann ich Alias-Befehle mit xargs verwenden?

  5. Wie kann ich einen Warndialog mit Python unter Linux verwenden?

So installieren und verwenden Sie den Linux-Bildschirm mit Befehlen

So erstellen Sie neue Benutzer in OpenShift mit htpasswd und OAuth

So installieren und verwenden Sie Alpine mit Gmail IMAP unter Linux

So installieren und verwenden Sie den Ack-Befehl unter Linux mit Beispielen

So verwenden Sie einen SSH-Schlüssel mit Nicht-Root-Benutzern

Android - Wie kann ich Shell-Befehle verwenden und mit dem darunter liegenden Linux-System interagieren?