Ich möchte mehrere c-Quelldateien in einem Verzeichnis kopieren und umbenennen.
Ich kann so kopieren:
$ cp *.c $OTHERDIR
Aber ich möchte allen Dateinamen ein Präfix geben:
file.c --> old#file.c
Wie kann ich das in 1 Schritt machen?
eine for
Schleife:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
Ich füge oft die -v
Option hinzu, cp
damit ich den Fortschritt verfolgen kann.
Sie können Shell Globbing verwenden:
for f in *.c; do cp -- "$f" "$OTHERDIR/old#$f"; done
Das for variable in GLOB
Format erweitert den Glob auf alle übereinstimmenden Dateien / Verzeichnisse (mit Ausnahme der versteckten) und iteriert über diese, wobei jede nacheinander als $variable
(im obigen Beispiel $f
) gespeichert wird . Der Befehl, den ich zeige, durchläuft also alle nicht versteckten Dateien, kopiert sie und fügt das Präfix hinzu.
for f in /foo/bar/*.c
,$f
wird der gesamte Pfad enthalten, stattdessen nur der Name der Datei. Wie kann ich nur den Namen der Datei erhalten?cd /foo/bar/; for f in *c
oder verwendenfor f in /foo/bar/*.c; do name=${f##*/} ...
odername=$(basename "$f")
.Noch ein anderer Weg:
Jedes Mal, wenn Sie auf diese Weise laufen, wird dir / from geändert:
In:
Und dann:
Und dann...:
.. und so weiter.
quelle
find
die Ausgabe . Verwenden Siegrep
diese Option nicht , um Dateinamen auszuschließen, wenn diesfind
alleine möglich ist.Hier ist, wie man es bei Bedarf rekursiv machen würde:
quelle
find
die AusgabeHier ist ein Einzeiler mit
xargs
,tr
und Globbing. Könnte einen Wert haben.Dies gibt alle übereinstimmenden Dateien
*.c
als durch Leerzeichen getrennte Zeichenfolge zurück. Als nächstes werdentr
die zusätzlichen Leerzeichen in Zeilenumbrüche umgewandelt ( NB hat Dateinamen nicht mit Leerzeichen ** getestet). Wirdxargs
dann mit jedem Dateinamen gefüllt undcp
mit dem entsprechenden Namen und Präfix ausgeführt.*.c
kann für andere nützliche Globs geändert werden. Andere Präfixe im Teilxargs
undcp
können ebenfalls verwendet werden.** für diejenigen mit Leerzeichen in ihren Dateinamen:
(erfordert
find
Unterstützung-print0
) Ähnlich wie oben können wirfind
eine durch Null getrennte Liste von Dateien ausgeben undxargs
mit einem Flag optimieren , um bei Null zu trennenquelle