So erzwingen Sie das Überschreiben von cp ohne Bestätigung


666

Ich versuche, den cpBefehl zu verwenden und ein Überschreiben zu erzwingen.

Ich habe es versucht cp -rf /foo/* /bar, werde aber dennoch aufgefordert, jedes Überschreiben zu bestätigen.

Antworten:


1111

Sie können dies tun yes | cp -rf xxx yyy, aber mein Bauchgefühl besagt, dass die meisten modernen Systeme (hauptsächlich RH-Derivate) dies für Root-Profile tun, wenn Sie dies als Root tun - Ihr .bashrcoder .profilemit einem Alias ​​von cpto cp -i.

Sie können vorhandene Aliase überprüfen, indem Sie sie aliasan der Eingabeaufforderung ausführen oder which cpAliase nur auf überprüfen cp.

Wenn Sie einen Alias ​​definiert haben, unalias cpwird dieser durch Ausführen für die aktuelle Sitzung aufgehoben. Andernfalls können Sie ihn einfach aus Ihrem Shell-Profil entfernen.

Sie können einen Alias ​​vorübergehend umgehen und die nicht aliasisierte Version eines Befehls verwenden, indem Sie ihm \z\cp whatever


3
Seien Sie auch vorsichtig - selbst wenn der Alias ​​nicht direkt in .bashrc geschrieben ist , werden Sie auf dieses Verhalten stoßen, wenn irgendetwas anderes, das diese Datei aufruft, etwas anderes aufruft, das den Alias ​​für cp manipuliert.
Jon

4
Mit "modernen Systemen" meint er RHEL / centos / fedora und vielleicht noch etwas anderes, Debian / Ubuntu alias cp nicht. Ich bevorzuge RHEL auf dem Server und benutze Fedora fast ein Jahrzehnt lang, aber die Community-Unterstützung von Ubuntu und der Wechsel zurück zu Gnome haben mich umworben, nachdem Nvidia meine Fedora-Installation beendet hat. Ich bin ¯\_(ツ)_/¯dabei.
Ray Foss

2
@ RayFoss Hinzugefügt eine (primarily RH-derivatives)Bemerkung :)
favoretti

Nachdem unalias cpSie alles getan und kopiert haben, was Sie zum Kopieren benötigen, können Sie den Alias ​​auf den Standardwert zurücksetzen alias cp='cp -i'. Führen alias cpSie anschließend aus, damit Sie überprüfen können, ob der Standardalias wiederhergestellt ist.
Jaxarroyo

287

Dies wird wahrscheinlich dadurch verursacht, cpdass Sie bereits auf so etwas eingestellt sind cp -i. cpDirekt anrufen sollte funktionieren:

/bin/cp -rf /zzz/zzz/* /xxx/xxx

Eine andere Möglichkeit, dies zu umgehen, ist die Verwendung des folgenden yesBefehls:

yes | cp -rf /zzz/zzz/* /xxx/xxx

6
Ja, ich habe Unalias cp -i gemacht, jetzt funktioniert es. Vielen Dank für Ihre wertvolle Antwort.
Thiyagu114

5
Ich liebe es, dass Unix den yesBefehl liefert . Urkomisch. Und eines Tages kann ich es benutzen.
Matthew Leingang

3
Ja, es war ein Alias, netter Fang :) Sie können \ cp verwenden, um das ursprüngliche cp aufzurufen, einfacher als sich an den Pfad / bin / cp zu erinnern
Hugo Zaragoza

Ja, das ist eine andere Möglichkeit, den Alias ​​zu umgehen. Eine Art ordentlicher Hack!
pgl

1
Dieser Weg ist sicherer.
Plusmancn

115

Wie in einigen anderen Antworten angegeben, verwenden Sie wahrscheinlich irgendwo einen Alias, der zugeordnet ist cp, cp -ioder etwas Ähnliches. Sie können einen Befehl ohne Aliase ausführen, indem Sie ihm einen Backslash voranstellen. Versuchen Sie es in Ihrem Fall

\cp -r /zzz/zzz/* /xxx/xxx

Der Backslash deaktiviert vorübergehend alle von Ihnen aufgerufenen Aliase cp.


2
@zhouji Das Spiel deaktiviert den Alias, wie in meiner Antwort angegeben. Anstatt den Alias aufzurufen cp, \cpwird der Befehl aufgerufen cp. Dies scheint das Äquivalent zum Laufen zu sein command cp.
Chris

66

Sie haben wahrscheinlich irgendwo einen Alias, cpder zugeordnet ist cp -i. weil mit den Standardeinstellungen cpnicht zum Überschreiben aufgefordert wird. Überprüfen Sie Ihre .bashrc, Ihre .profileusw.

Siehe cp-Manpage : Nur wenn ein -iParameter angegeben ist, wird cpvor dem Überschreiben tatsächlich eine Aufforderung angezeigt.

Sie können dies über den folgenden aliasBefehl überprüfen :

$ alias
alias cp='cp -i'
alias diff='diff -u'
....

Verwenden Sie zum Aufheben der Definition des Alias ​​Folgendes:

$ unalias cp

Ja, ich habe Unalias cp -i gemacht, jetzt funktioniert es. Vielen Dank für Ihre wertvolle Antwort.
Thiyagu114

1
es ist nur "unalias cp"
Krv Perera

49

Wie andere Antworten angegeben haben, könnte dies passieren, wenn cpes sich um einen Alias ​​von handelt cp -i.

Sie können ein \vor dem cpBefehl anhängen , um es ohne Alias ​​zu verwenden.

\cp -fR source target

1
Wie Sie sagten, haben andere dies bereits gesagt. Warum hat das 45 Upvotes bekommen?
Phil294

@ phil294 Ich denke, dies ist der einfachste Weg, ohne den Alias ​​zu ändern oder den CP-Alias ​​zu entfernen, der für andere Verwendungen nützlich sein kann. `` Es ist sehr nützlich hier.
Arnold Roa

18

Standardmäßig cphat Aliase zu cp -i. Sie können es überprüfen, eingeben aliasund einige sehen wie:

alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'

Um dieses Problem zu lösen, verwenden Sie /bin/cp /from /tostattdessen einfach den Befehlcp /from /to


9

Sie können diesen Befehl auch verwenden:

cp -ru /zzz/zzz/* /xxx/xxx

Es würde jedoch Ihre vorhandene Datei mit der neueren aktualisieren.


8

cp ist normalerweise so aliasiert

alias cp='cp -i'   # i.e. ask questions of overwriting

Wenn Sie sicher sind, dass Sie das Überschreiben durchführen möchten, verwenden Sie Folgendes:

/bin/cp <arguments here> src dest


7

Deshalb stoße ich oft darauf cp -iv, weil ich mich auf CP konzentriere und einen ordentlichen Trick gefunden habe. Es stellt sich heraus, dass zwar -iund -nbeide frühere Überschreibungsanweisungen abbrechen, dies -fjedoch nicht der Fall ist. Wenn Sie es jedoch verwenden -nf, wird die Möglichkeit hinzugefügt, das zu löschen -i. Damit:

cp -f /foo/* /bar  <-- Prompt
cp -nf /foo/* /bar <-- No Prompt

Ziemlich ordentlich, oder? / Nekropost



5

Eine andere Möglichkeit, den Befehl ohne Alias commandaufzurufen, besteht darin, die integrierte Bash zu verwenden.

command cp -rf /zzz/zzz/*


4

-n ist "nicht zu überschreiben", aber seine Frage ist völlig entgegengesetzt zu dem, worauf Sie geantwortet haben.

Um diese Bestätigung zu vermeiden, können Sie einfach den Befehl cp mit dem absoluten Pfad ausführen. Dadurch wird der Alias ​​vermieden.

/ bin / cp Quelldateiziel


2

Wenn Sie den Alias ​​unverändert auf globaler Ebene halten und nur für Ihr Skript ändern möchten.

Benutz einfach:

Alias ​​cp = cp

und schreiben Sie dann Ihre Folgebefehle.


0

Ich habe einfach Unalias verwendet, um den Alias ​​"cp -i" zu entfernen, dann die Kopie zu erstellen und dann den Alias ​​zurückzusetzen. ::

unalias cp  
cp -f foo foo.copy  
alias cp="cp -i"  

Nicht der schönste Code, aber einfach einzustellen und effizient. Ich überprüfe auch, ob der Alias ​​bereits mit einem einfachen zurückgesetzt ist

alias |grep cp

-2

Es ist nicht cp -i. Wenn Sie nicht um Bestätigung gebeten werden möchten, ist dies der Fall cp -n. zum Beispiel:

cp -n src dest

Oder bei Verzeichnissen / Ordnern ist:

cp -nr src_dir dest_dir

2
Andere gaben an, dass das mit dem Benutzer verbundene CP cp -ivom System verknüpft wurde, was bedeutete, dass sie versuchten, die Standardeinstellung zu überwinden und ein Überschreiben zu erzwingen . Es hört sich so an, als hätten Sie dies als vorgeschlagene Syntax verwechselt, aber ein Überschreiben -nwird verhindert .
Verlassener Wagen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.