Kopieren Sie eine Gruppe von Dateien (Dateiname *) in die Sicherung (Dateiname * .bak).

13

Hintergrund

Unter Linux können Sie:

  • Listen Sie eine Gruppe von Dateien mit ls Filename*
  • Entfernen Sie eine Gruppe von Dateien mit rm Filename*
  • Verschieben Sie eine Gruppe von Dateien mit mv Filename* /New/Directory
  • Sie können eine Gruppe von Dateien jedoch nicht kopieren mit:cp Filename* *.bak

Ändern Sie den Linux- cpBefehl, um eine Dateigruppe zu kopieren

Ich habe eine Gruppe von Dateien, die ich kopieren möchte, ohne die Namen einzeln einzugeben und den folgenden cpBefehl zu verwenden:

$ ls gmail-meta3*
gmail-meta3                          gmail-meta3-REC-1558392194-26467821
gmail-meta3-LAB-1558392194-26467821  gmail-meta3-YAD-1558392194-26467821

Wie kann ich so etwas wie den alten DOS-Befehl verwenden copy gmail-meta3* *.bak?

Ich möchte keinen ähnlichen Befehl viermal eingeben:

cp gmail-meta3-LAB-1558392194-26467821 gmail-meta3-LAB-1558392194-26467821.bak

Ich suche ein Skript / eine Funktion / eine App, die Parameter für alte und neue Dateinamengruppen akzeptiert und nicht etwas mit fest codierten Dateinamen. Ein Benutzer kann beispielsweise Folgendes eingeben:

copy gmail-meta3* *.bak

oder sie könnten eingeben:

copy gmail-meta3* save-*
WinEunuuchs2Unix
quelle
1
Das Problem scheint mir, dass ich den Glob-Operator zweimal verwende, den keiner Ihrer anderen Befehle verwendet. Bash ist nicht klug genug, um damit umzugehen.
qwr
2
@qwr, die Tatsache, dass bash Metazeichen erweitert und die Eingabe tokenisiert, bevor sie an einen auszuführenden Befehl übergeben wird, ist Teil des Entwurfs der UNIX-Shells. Irgendwie zu versuchen, eine Ausnahme für den Befehl cp zu programmieren, würde die gesamte Konsistenz von bash beeinträchtigen, was überhaupt nicht klug wäre. Versuchen Sie als Übung herauszufinden, was hier passiert und warum es die Metazeichenerweiterung der Shell ist, die es so macht:touch aa ab ba; mkdir bb; cp a* b*; ls *
Mike S
@ MikeS Danke für die Hinweise. Gestern hat jemand anderes gesagt, dass Sie einen Platzhalter *für die Quelldateinamen verwenden können, nicht jedoch für die Zieldateinamen. Als solches muss ein Ersatz-Platzhalter (ich denke, er ##wurde vorgeschlagen, aber ich neige dazu %) für das Ziel verwendet werden. Ich denke, das ist es, was Sie verstärken? Ich hatte nicht erwartet, den cpBefehl überhaupt zu ändern . Erstellen Sie einfach ein Wrapper-Skript mit dem Namen copy, das den DOS-Kopierbefehl (innerhalb eines angemessenen Rahmens) emuliert.
WinEunuuchs2Unix
@ WinEunuuchs2Unix diese Person war korrekt. Die Shell-Metazeichen sind unabhängig von den Befehlen. Alle Platzhalter versuchen also, alle Dateien abzugleichen, die dem Muster entsprechen. Wenn Sie versuchen, ein universelles Programm zu erstellen , das "alles zusammenfügt und in das kopiert, was sie waren, aber dieses Suffix hinzufügen", dann wird das Setzen eines nicht entkoppelten Metazeichens als Ziel wahrscheinlich nicht das tun, was Sie wollen. Weil alle Metazeichen in der Shell-Befehlszeile erweitert werden. Wenn Sie sicher wissen, dass das Ziel-Metazeichen niemals eine Übereinstimmung bilden wird, können Sie es verwenden, da die Shell es nicht erweitern kann.
Mike S
... aber das wäre eine hässliche Sache. Verwenden Sie besser ein Sonderzeichen. % oder Unterstrich sind gut, sie sind im Allgemeinen keine Metazeichen (aber achten Sie darauf,% in einer Crontab-Datei zu verwenden; es ist dort etwas Besonderes).
Mike S

Antworten:

14

Hier ist ein Beispiel für eine atypische Verwendung von sed, die für diese Aufgabe gilt:

sed -i.bak '' file-prefix*

Auf diese Weise sedwerden die Dateien tatsächlich nicht geändert, da wir keine Befehle bereitgestellt haben. ''Aufgrund der Option -i[suffix]wird jedoch eine Sicherungskopie jeder Datei erstellt. Ich habe diesen Ansatz bei der Suche gefunden. Gibt es eine Möglichkeit, eine Sicherungskopie einer Datei zu erstellen, ohne den Namen zweimal einzugeben?

pa4080
quelle
Zu $ time sed -i.bak '' gmail-meta3*real 0m0.069s
Ihrer Information
Wenn bereits Dateien vorhanden sind, dann : real 0m0.037s. Wenn Dateien gelöscht werden und ein zweites Mal in der Nähe der cpGeschwindigkeit ausgeführt werden : real 0m0.051s.
WinEunuuchs2Unix
@xiota Ein interessanter Punkt. Es stellt sich heraus, dass sedes schneller ist, wenn bereits Zieldateien vorhanden sind, aber cplangsamer, wenn Zieldateien vorhanden sind. Ich spüle tatsächlich Caches und Puffer, anstatt syncgroße Timing-Tests durchzuführen, aber diesmal habe ich beides nicht getan. Da dies zu einer ganz anderen Seifenoper führen kann, die nicht zum Thema gehört, muss ich leider meine Testergebnisse mitteilen :( Ist es zu spät, um so zu tun, als ob diese Konversation nie stattgefunden hätte? Es ist auch keine Festplatte, es ist eine Samsung Pro 960 NVMe SSD auf 4 Kanälen.
WinEunuuchs2Unix
1
Es spielt wahrscheinlich keine Rolle, welches Speichergerät Sie für diese Tests haben, wenn dies auf einem Linux-Computer geschieht. Der Kernel ist extrem gut darin, Dateien im Speicher zu puffern. Dies ist der Wert für "Buff / Cache", wenn der freeBefehl verwendet wird. Die tatsächlichen Schreibvorgänge auf das Gerät erfolgen zu einem Zeitpunkt, der von einem Algorithmus ausgewählt wird, der das Alter des Caches und den Speicherdruck auf dem Computer berücksichtigt. Wenn Sie mehrere Tests versuchen, werden die ersten Dateilesevorgänge von der Festplatte ausgeführt, die nachfolgenden Lesevorgänge werden jedoch höchstwahrscheinlich direkt aus dem Speicher ausgeführt (siehe sync; echo 3 > /proc/sys/vm/drop_caches).
Mike S
Gestern habe ich nur wenige Tests mit großen Dateien über 2 GB durchgeführt und - ja, dieser Ansatz ist relativ langsam als die Verwendung des cpBefehls, aber ich kann nicht sagen, dass es einen signifikanten Leistungsunterschied gibt .
pa4080
13

Sie können verwenden find:

find . -max-depth 1 -name 'gmail-meta3*' -exec cp "{}" "{}.bak" \;

Dadurch werden im aktuellen Verzeichnis .alle Dateien mit einem Namen gefunden, der mit dem Glob-Muster übereinstimmt (beachten Sie die einfachen Anführungszeichen um das Muster, um ein Globbing der Shell zu verhindern). Für jede gefundene Datei wird sie cpvon name zu name.bak ausgeführt. Das \; Am Ende wird sichergestellt, dass jede Datei einzeln ausgeführt wird, anstatt alle auf einmal zu übergeben. Die maximale Tiefe als 1 durchsucht nur das aktuelle Verzeichnis, anstatt nach unten zu rekursieren.

cbojar
quelle
1
Funktioniert es, find . -max-depth 1 -name '"$1"'' -exec cp "{}" "{}$2" \;wenn $ 1 die Quelle und $ 2 die Erweiterung ist?
WinEunuuchs2Unix
$ 2 sollte in Ordnung sein, um zu ersetzen, solange es vernünftig ist. $ 1 könnte schwieriger sein, da wir keine variable Ersetzung in einfachen Anführungszeichen durchführen können. Ich bin mir nicht sicher, aber es könnte möglich sein, $ 1 in doppelten Anführungszeichen zu verwenden, da das Muster in einer Zeichenfolge gespeichert ist.
Cbojar
11

Sie können eine forSchleife mit verwendenbash . Normalerweise würde ich es nur als Einzeiler eingeben, da dies keine Aufgabe ist, die ich oft ausführe:

for f in test* ; do cp -a "$f" "prefix-${f}.ext" ; done

Wenn Sie es jedoch als Skript benötigen:

cps() {
   [ $# -lt 2 ] && echo "Usage: cps REGEXP FILES..." && return 1

   PATTERN="$1" ; shift

   for file in "$@" ; do
      file_dirname=`dirname "$file"`
      file_name=`basename "$file"`
      file_newname=`echo "$file_name" | sed "$PATTERN"`

      if [[ -f "$file" ]] && [[ ! -e "${file_dirname}/${file_newname}" ]] ; then
         cp -a "$file" "${file_dirname}/${file_newname}"
      else
         echo "Error: $file -> ${file_dirname}/${file_newname}"
      fi
   done
}

Die Verwendung ist ähnlich wie rename. Zu testen:

pushd /tmp
mkdir tmp2
touch tmp2/test{001..100}     # create test files
ls tmp2
cps 's@^@prefix-@ ; s@[email protected]@' tmp2/test*    # create backups
cps 's@[email protected]@' tmp2/test*    # more backups ... will display errors
ls tmp2
\rm -r tmp2                   # cleanup
popd
Xiota
quelle
Zu $ time for f in gmail-meta3* ; do cp -a "$f" "${f}.bak" ; donereal 0m0.046s
Ihrer Information
Ähm nein, ich möchte nicht für die Zeit optimieren. Es sind 0.046Sekunden, was 0 Sekunden für die menschliche Wahrnehmung bedeutet. Ich habe nur versucht zu zeigen, wie ich gepostete Antworten testete und interessante Leckerbissen an Zuschauer weitergab, die den sedobigen Befehl betrachteten. Oder zumindest war ich daran interessiert, sedmit cp... zu vergleichen
WinEunuuchs2Unix
Ihre Lösung mit cpist jedoch schneller als die Lösung mit sed. Es ist also ein Grund zum Feiern :)
WinEunuuchs2Unix
(1)  -aist ein nicht standardmäßiger Testbetreiber. Warum nicht verwenden -e? (2) "Temporäres Verzeichnis kann nicht erstellt werden." ist eine etwas irreführende Fehlermeldung. (3) Warum nicht einfach verwenden mktemp -d? (4) Sie sollten den Exit-Status testen. Zum Beispiel sollten Sie ! mkdir "$FOLDER" && echo "Unable to create temporary directory." && return 1 oder  sagen mkdir "$FOLDER" || { echo "Unable to create temporary directory."; return 1;}. Ebenso für cpund  rename(und vielleicht sogar pushd, wenn Sie vorsichtig sein wollen). … (Fortsetzung)
G-Man sagt 'Reinstate Monica'
(Fortsetzung)… (5) Arrggghhhh! Sag nicht $@; sagen "$@". (5b)  Es ist nicht erforderlich, {und } wenn Sie Variablen so referenzieren, wie Sie es tun ( "${FOLDER}",  "${PATTERN}" und  "${file}"); nur tun "$FOLDER",  "$PATTERN" und  "$file". (6) Dies setzt voraus, dass sich die Dateien im aktuellen Verzeichnis befinden.  cps 's/$/.bak/' d/fooKopieren wird d/fooauf foo.bak im aktuellen Verzeichnis, nicht d/foo.bak.
G-Man sagt "Reinstate Monica"
6

Das DOS-Paradigma wird wahrscheinlich am nächsten kommen mcp(aus dem mmvPaket):

mcp 'gmail-meta3*' 'gmail-meta3#1.bak'

Wenn zshverfügbar, ist das dazugehörige zmvModul vielleicht etwas näher:

autoload -U zmv

zmv -C '(gmail-meta3*)' '$1.bak'

Ich würde es trotzdem vermeiden ls- eine Variante Ihrer eigenen Antwort , die für Leerzeichen (einschließlich Zeilenumbrüche) sicher ist, wäre

printf '%s\0' gmail-meta3* | while IFS= read -r -d '' f; do cp -a -- "$f" "$f.bak"; done

oder vielleicht

printf '%s\0' gmail-meta3* | xargs -0 -I{} cp -a -- {} {}.bak
Steeldriver
quelle
Ich verstehe, mmvist das Paket, aber in Kommentaren sagen Sie, der Befehl ist mcpaber dann in dem Befehl, den Sie verwenden, mmvder auch ein Befehl im mmvPaket ist. Ich mag die Richtung der printfBeispiele und in einem polierten Skript würde ich sicherstellen, dass $ 1 und $ 2 übergeben wurden. +1 für den Ball ins Rollen :)
WinEunuuchs2Unix
@ WinEunuuchs2Unix entschuldigt sich - der mcp / mmv war ein Brainfart. Eigentlich mcpist nur ein Synonym fürmmv -c
Steeldriver
Pfft keine Sorge. Wenn ich für jeden Tippfehler, den ich gemacht habe, einen Dollar hätte, wäre ich Millionär :) Ich hätte gerne eine Klarstellung auf printfBefehl, die ich nie wirklich benutzt habe. Wollen Sie damit sagen, printf '%s\0' "$1"*dass es funktionieren würde, wenn gmail-meta3es als Parameter 1 übergeben würde?
WinEunuuchs2Unix
@ WinEunuuchs2Unix Ich würde wahrscheinlich den aufrufenden Kontext das Globbing machen lassen, dh cps gmail-meta3*und dann printf '%s\0"$ @" | schreiben während ... `in der Funktion. Oder verwenden Sie einfach for f; do cp -- "$f" "$f.bak"; done(wie Xiotas Antwort , aber als Funktion)
Steeldriver
1
Beachten Sie, dass zmvSie den "Wildcard-Ersatz" -Modus verwenden können, den ich etwas einfacher zu verstehen finde:zmv -W -C 'gmail-meta3*' '*.bak'
0x5453
5

Nur rsync-Lösung

Wenn Sie nur Ihre Dateien sichern möchten, können Sie sie in ein neues Verzeichnis kopieren

rsync /path/to/dir/Filename* /path/to/backupdirectory

Dadurch werden die FilenameDateien von /path/to/dir/nach kopiert /path/to/backupdirectory.


rsync + Dateiname

Wenn Sie möchten, dass Ihre Sicherungsdateien ein Suffix haben, wird es mit rsync...

rsync -Iu /path/to/dir/Filename* /path/to/dir/Filename* -b --backup-dir=/path/to/backupdirectory --suffix=.bak

Dies würde die vorhandenen Dateien überschreiben ... mit den vorhandenen Dateien ( -I), aber nur, wenn sie ( -u) neuer sind (was sie nicht sind) und ein Backup mit einem Suffix erstellen.

Sie können dies auch im selben Verzeichnis tun. Schließen Sie vorhandene Backups jedoch besser aus.

rsync -Iu /path/to/dir/Filename* /path/to/dir/Filename* -b --backup-dir=/path/to/backupdirectory --suffix=.bak --exclude '*.bak'

Robert Riedl
quelle
Ich liebe es, rsycncalso habe ich upvoted, aber eine einfachere Methode wäre, cp Filename* /path/to/backup/dirweil Dateien keinen *.bakEindeutiger benötigen würden, wenn sie sich in einem separaten Verzeichnis befinden würden.
WinEunuuchs2Unix
4

Dieser sollte wie gewünscht tun:

cps(){ p="${@: -1}"; for f in "${@:1:$#-1}"; do cp -ai "$f" "${p//\?/$f}"; done  }

Verwendung:

cps FILES... pattern
Example 1: cps gmail-meta3* ?.bak
Example 2: cps * save-?
Example 3: cps * bla-?-blubb

Ich habe gewählt, ?weil #es zitiert werden muss, wenn es das erste Zeichen eines Musters ist, andernfalls wird es als Beginn eines Kommentars erkannt.

Prüfung:

$ touch 'test};{bla#?"blubb'
$ cps test* bla-?-blubb
$ ls
test};{bla#?"blubb  bla-test};{bla#?"blubb-blubb


Einige frühere Versionen des Skripts zum Hinzufügen eines Suffix:

Ähnlich wie @ WinEunuuchs2Unix Antwort, aber ich denke flexibler und nicht analysierenls :

cps(){ S="$1"; shift; printf '%s\0' "$@" | xargs -0 -I{} cp -abfS "$S" {} {}; }

Setzen Sie dies in Ihre .bashrc.

Verwendung:

cps SUFFIX FILES...
Example: cps .bak gmail-meta3*

Alternative mit dem Suffix als letztem Argument ( via und via ):

cps(){ S="${@: -1}"; printf '%s\0' "${@:1:$#-1}" | xargs -0 -I{} cp -abfS "$S" {} {}; }

Verwendung:

cps FILES... SUFFIX
Example: cps gmail-meta3* .bak

pLumo
quelle
Gute Codierung, aber es ist schwierig, nach Jahrzehnten mit Source und Target den
Kopierbefehl
Die Funktion mit dem Suffix auf der Rückseite wurde hinzugefügt.
pLumo
Danke, das ist intuitiver. Es als Suffix zu bezeichnen ist genau so, wie meine Antwort es codiert hat, aber es ist wirklich ein Ziel oder ein Ziel. Andere Benutzer möchten möglicherweise Folgendes verwenden : copy gmail-meta3* old-meta3*. In meiner Antwort konnte ich nicht herausfinden, wie ich *in den
Zielnamen komme,
Das Problem ist, dass dies *von der Shell interpretiert wird, sodass die Funktion nichts davon weiß. Sie benötigen ein anderes Zeichen oder zitieren es und ersetzen es dann durch den ursprünglichen Dateinamen innerhalb der Funktion.
pLumo
Ich denke, das #könnte als Ersatz-Platzhalter für verwendet werden *? Sie könnten also tippen copy filenames# save-#. Ich denke, Sie möchten, dass das Platzhalterzeichen für Quelle und Ziel identisch ist.
WinEunuuchs2Unix
4

Ich habe diesen Einzeiler in meine geschrieben ~/.bashrc. findIch nehme an , es können viel bessere Antworten mit gepostet werden. Noch bessere Antworten könnten in C geschrieben werden. Hoffentlich bringt diese Frage und Antwort den Ball ins Rollen, um bessere Antworten zu erhalten:

cps () {
    # cps "Copy Splat", copy group of files to backup, ie "cps Filename .bak"
    # Copies Filename1 to Filename1.bak, Filename2 to Filename2.bak, etc.
    # If Filename1.bak exists, don't copy it to Filename1.bak.bak
    for f in "$1"*; do [[ ! "$f" == *"$2" ]] && cp -a "$f" "$f$2"; done

    # OLD version comments suggested to remove 
    # ls "$1"* | while read varname; do cp -a "$varname" "$varname$2"; done
}
  • for f in "$1"*; do: $1ist der gmail-meta3Parameter und fdie Liste der übereinstimmenden Dateien. Kombiniert bedeutet dies für Google Mail-Meta3, Google Mail-Meta3-LAB-9999 usw. Folgendes
  • [[ ! "$f" == *"$2" ]] &&: $fist das gleiche wie foben. $2ist der übergebene .bakParameter. Kombiniert bedeutet dies, wenn der Dateiname nicht auf endet .bak(weil wir nicht kopieren .bakund erstellen möchten .bak.bak), gehen Sie wie folgt vor
  • cp -a "$f" "$f$2"; Kopieren Sie gmail-meta3 nach gmail-meta3.bak usw.
  • done: Schleife zurück und nimm den nächsten Dateinamen in gmail-meta3* Liste.

cps gmail-meta3 .bak Beispielausgabe

Anhand der Frage als Beispiel sehen Sie, wie sie in Aktion aussieht:

───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll gmail-meta3*
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3.bak
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821
-rw-rw-r-- 1 rick rick   728954 Jun 27 05:46 gmail-meta3-YAD-1558392194-26467821.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ cps gmail-meta3 .bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll gmail-meta3*
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3.bak
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ 

Hinweis: Hierbei wird das -aFlag mit dem cpBefehl verwendet, um Zeitstempel beizubehalten und einen besseren Überblick über Ihre Dateisicherungen zu erhalten.

Beachten Sie, dass die Dateikopien genau das gleiche Datum und die gleiche Uhrzeit haben wie die Originale. Wenn der -aParameter weggelassen würde, würden sie das aktuelle Datum und die aktuelle Uhrzeit erhalten und würden nicht wie eine echte Sicherung aussehen, außer dass die Dateigröße gleich wäre.

WinEunuuchs2Unix
quelle
6
empfehlen die Leute nicht immer gegen das Parsenls
qwr
3
Da Sie erwähnen, findnehme ich an, dass Sie sich der Gefahren des Parsens bewusst sind ls? Aber in Ihrem Fall ist beides nicht notwendig: Tun Sie es einfach for file in "$1"*; do copy -a "$file" "$file$2"; done- dies ist völlig sicher und viel einfacher als jede Art von Indirektion über lsoder findund eine whileSchleife.
Konrad Rudolph
@KonradRudolph Danke für deinen Vorschlag. Ich habe Ihren Vorschlag mit ein paar kleinen Änderungen umgesetzt und getestet.
WinEunuuchs2Unix
2

Eine andere Methode, um Ihre Anforderung zu erfüllen, besteht darin, die Dateien in ein temporäres Verzeichnis zu kopieren und sie mit dem renameBefehl umzubenennen.

$ mkdir backup
$ cp filename* /tmp/rename-backup/
$ rename 's/(filename.*)/$1.bak/' /tmp/rename-backup/*
$ mv /tmp/rename-backup/* ./

Wenn Sie es als Skript benötigen, können Sie es so verwenden

cps () {
    mkdir -p /tmp/rename-backup/
    cp "$1"* /tmp/rename-backup/
    rename "s/($1.*)/\$1.$2/" /tmp/rename-backup/*
    mv "/tmp/rename-backup/$1"*".$2" .
}

Und Sie können es so verwenden:

cps file bak

Dies ist ein Beispiel

$ ls -l
total 0
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file a
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ab
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ac
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename1
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename2
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename3
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename4
$ cps file bak
$ ls -l
total 0
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file a
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file a.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ab
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file ab.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ac
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file ac.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename1
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename1.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename2
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename2.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename3
-rw-r--r--  1 danny  wheel  0 Jun 26 16:41 filename3.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename4
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename4.bak
Dan
quelle