So führen Sie den Befehl „mv“ unter bestimmten Bedingungen aus – verschieben Sie Dateien mit einer bestimmten Endung in einen anderen Ordner

So führen Sie den Befehl „mv“ unter bestimmten Bedingungen aus – verschieben Sie Dateien mit einer bestimmten Endung in einen anderen Ordner

Ich bin Informatikstudent. Zweites Studienjahr – und lerne etwas über Linux. Wegen des Coronavirus lerne ich selbstständig. Während meines Studiums bin ich auf eine Frage mit mehreren Abschnitten gestoßen – ich kann sie nicht lösen.

Die Frage verlangt von mir, den Befehl auszuführen mv, mit dem ich einige Dateien in den Ordner übertrage. Ich habe versucht, den Befehl auszuführen mvund habe versucht, „Pipe“ oder andere Befehle wie zu integrieren find.

Das ist meiner Meinung nach kein normaler mvBefehl, da müssen noch mehr Sachen eingebaut werden, wie, das kann ich nicht entziffern. Ich habe ein paar Tage lang versucht, die Frage zu lösen. Ich habe auch versucht, ähnliche Fragen im Forum zu finden – aber ich konnte sie nicht finden.

Die Frage:

  1. .cSchreiben Sie einen Befehl, der alle Dateien mit der Endung oder .hin den Ordner kopiert Programs.

Mein Versuch war vielleicht, Folgendes zu tun:

find "*.c" -o "*.h" | mv Programs

Antwort1

Die Zuordnung kann auf drei Arten interpretiert werden:

  1. Alle .cDateien kopieren.haus dem aktuellen Verzeichnisin das Verzeichnis Programs, oder
  2. Alle .cDateien kopieren.haus dem aktuellen Verzeichnis oder irgendwo darunterzum Verzeichnis Programs.
  3. Kopieren Sie alle zugänglichen .cund.h von überall auf dem Systemzum Verzeichnis Programs.

cpBeachten Sie, dass die Zuweisung „kopieren“ und nicht „verschieben“ lautet. Dies bedeutet, dass Sie den Befehl verwenden sollten , nicht mv.

Die erste Interpretation der Aufgabe wird gelöst durch

cp *.[ch] Programs

(vorausgesetzt, das *.[ch]trifft auf alle Dateien zu, die uns interessieren, und es gibt nicht viele Tausend davon im aktuellen Verzeichnis).

Die zweite Interpretation der Aufgabe wird gelöst durch

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

Dies sucht nach allen regulären Dateien mit einem .coder .hDateinamensuffix im aktuellen Verzeichnis oder darunter und wird cpfür jede dieser Dateien ausgeführt. Wir können nicht weiterleiten, cpda dieses Dienstprogramm seinen Standardeingabestream nicht liest.

Wir sorgen auch dafür,vermeidenSuchen Sie im ProgramsVerzeichnis (vermutlich ein Unterverzeichnis im aktuellen Verzeichnis). Wenn Sie das nicht tun, werden Dateien von Programsnach kopiert Programs. Siehe "Erklären Sie die Optionen -path und -prune von find" für weitere Informationen über -pathund -prune.

Die dritte Interpretation lässt sich leicht aus der zweiten umsetzen:

find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

... wir müssen einfach findoben im Verzeichnisbaum beginnen und angeben, dass das Programszu vermeidende Verzeichnis dasjenige am Pfad ist $PWD/Programs.

Dies wird wahrscheinlich eine Reihe von Fehlern verursachen, da Sie nicht überall Zugriff haben. Um dies zu vermeiden, bereinigen Sie auch Verzeichnisse, auf die Sie nicht zugreifen können, und kopieren Sie nur Dateien, die Sie lesen können:

find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
    -type f -name '*.[ch]' -readable -exec cp {} Programs \;

Dies erfordert GNU findfür den -executableTest (ein Verzeichnis ist durchsuchbar, wenn es ausführbar ist) und den -readableTest.

Beachten Sie, dass die findVariationen hier die Dateien auf nur normale Dateien beschränken (durch den -type fTest), während der cp *.[ch]Ansatz alles kopieren würde, was mit diesen beiden Zeichen endet. Außerdem findwürde die Lösung versteckte Dateien kopieren (Dateien mit Namen, die mit einem Punkt beginnen), während die erste Lösung diese Namenstypen standardmäßig nicht abgleichen würde.

verwandte Informationen