2016-09-18 3 views
-1

Was ich mit diesem Shell-Skript grundsätzlich tun will, ist, dass der Benutzer ein Verzeichnis über die Konsole eingibt und die Ausgabe alle .c-Dateien enthält, die sich in diesem Verzeichnis und den Unterverzeichnissen befinden (die Dateien sind an den aktuellen Speicherort des Skripts kopiert).Wie kopiert man bestimmte Dateierweiterungen bei der Eingabe des Verzeichnisses?

rsync -va --include "*/" --include '*.c' --exclude '*' "$1/" . 

Allerdings, wenn ich das Skript (sh test.sh Díra) kopiert alle Unterverzeichnisse innerhalb des $ 1 Verzeichnis, mit nichts in ihnen (nicht einmal die .c-Dateien). Ich möchte, dass die Ausgabe nicht die Verzeichnisse sind, sondern NUR die .c-Dateien.

Also wenn ich ls im aktuellen Verzeichnis wäre, sollte es mit einer Reihe von Dateien kommen wie: file.c file1.c file2.c NICHT dir1 dir2 dir3.

+1

SO ist für die Programmierung Fragen, nicht Unix-Tech-Support. – Barmar

Antwort

0

Sie sollten einfach --exclude '*' weglassen. Wie es später in der Befehlszeile auftritt, wird es angewendet, nachdem eine Kandidatendatei den --include '*.c' Test bestanden hat und jede Datei zurückgewiesen wird.

Also, für einfaches Kopieren jede .c Datei innerhalb des gegebenen Teilbaum einer Hierarchie bei aktuellen Verzeichnis eine Ebene verwenden:

rsync -va --include '*.c' "$1" . 

EDIT:

Als rsync dreht sich alles um das Kopieren und Wenn Sie Hierarchien synchronisieren, ist dies das falsche Werkzeug, um Hierarchien in einem einzigen Verzeichnis zu reduzieren. Für eine solche Operation benötigen Sie einen Befehl, der den Quellpfad für die Zielseite explizit ignoriert (wie zB cp).

z. in Ihrem Fall könnten Sie verwenden:

find "$1" -name '*.c' -print0 | xargs -0 -I'{}' cp {} . 
+0

Daten wurden gesendet und abgerufen, aber die C-Dateien wurden nicht verschoben. Werde ich das rsync vielleicht falsch benutzen? Sollte ich -cp anstelle von -va verwenden? – Orcka

Verwandte Themen