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 mv
und habe versucht, „Pipe“ oder andere Befehle wie zu integrieren find
.
Das ist meiner Meinung nach kein normaler mv
Befehl, 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:
.c
Schreiben Sie einen Befehl, der alle Dateien mit der Endung oder.h
in den Ordner kopiertPrograms
.
Mein Versuch war vielleicht, Folgendes zu tun:
find "*.c" -o "*.h" | mv Programs
Antwort1
Die Zuordnung kann auf drei Arten interpretiert werden:
- Alle
.c
Dateien kopieren.h
aus dem aktuellen Verzeichnisin das VerzeichnisPrograms
, oder - Alle
.c
Dateien kopieren.h
aus dem aktuellen Verzeichnis oder irgendwo darunterzum VerzeichnisPrograms
. - Kopieren Sie alle zugänglichen
.c
und.h
von überall auf dem Systemzum VerzeichnisPrograms
.
cp
Beachten 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 .c
oder .h
Dateinamensuffix im aktuellen Verzeichnis oder darunter und wird cp
für jede dieser Dateien ausgeführt. Wir können nicht weiterleiten, cp
da dieses Dienstprogramm seinen Standardeingabestream nicht liest.
Wir sorgen auch dafür,vermeidenSuchen Sie im Programs
Verzeichnis (vermutlich ein Unterverzeichnis im aktuellen Verzeichnis). Wenn Sie das nicht tun, werden Dateien von Programs
nach kopiert Programs
. Siehe "Erklären Sie die Optionen -path und -prune von find" für weitere Informationen über -path
und -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 find
oben im Verzeichnisbaum beginnen und angeben, dass das Programs
zu 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 find
für den -executable
Test (ein Verzeichnis ist durchsuchbar, wenn es ausführbar ist) und den -readable
Test.
Beachten Sie, dass die find
Variationen hier die Dateien auf nur normale Dateien beschränken (durch den -type f
Test), während der cp *.[ch]
Ansatz alles kopieren würde, was mit diesen beiden Zeichen endet. Außerdem find
wü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.