Frage

Ich habe ein Verzeichnis wie folgt aus:

dir
dir/somefile.txt
dir/subdir/subsub/somefile2.txt
dir/subdir2/somefile.txt

und ich möchte die Dateien alle Unterverzeichnisse in einer einzigen Instanz eines Befehls in alle öffnen. Ich habe versucht, finden mit -exec oder xargs, aber diese öffnen jede Datei mit einer separaten Instanz eines Befehls.

Im Grunde möchte ich etwas, das nach oben endet wie kate dir/somefile.txt dir/subdir/subsub/somefile2.txt dir/subdir2/somefile.txt, aber für eine beliebige Anzahl von Dateien in einem beliebigen Anzahl von Unterverzeichnissen. Ich verwende bash, aber alle Skript Vorschläge sind in Ordnung.

Klarstellung: Ich habe einfach nicht TXT-Dateien bedeuten, aber jede ASCII-Datei (. Dh .php, .txt, .html, etc ..)

War es hilfreich?

Lösung

Versuchen

kate `find . -name \*.txt -type f`

, wo die -type f Sie verhindert, dass Verzeichnisse zu treffen.

Hier ist ein Beispiel unter Verwendung von ls -1 statt kate:

edd@ron:~/src/debian/R$ ls -1 `find . -type f -name \*.txt`
./R-2.10.0/src/extra/graphapp/readme.txt
./R-2.10.0/src/extra/xdr/copyrght.txt
./R-2.10.0/src/extra/xdr/README.txt
./R-2.10.0/src/gnuwin32/fixed/etc/rgb.txt
./R-2.10.0/src/gnuwin32/installer/CustomMsg.txt
./R-2.10.0/src/library/grid/inst/doc/changes.txt
./R-2.10.0/src/unix/system.txt
./R-2.9.2-ra-1.2.8/src/extra/graphapp/readme.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/copyrght.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/README.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/fixed/etc/rgb.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/installer/CustomMsg.txt
./R-2.9.2-ra-1.2.8/src/library/grid/inst/doc/changes.txt
./R-2.9.2-ra-1.2.8/src/unix/system.txt
edd@ron:~/src/debian/R$

und wenn Sie wirklich alle Dateien in Unterordner haben wollen, der Anruf vereinfacht zu

kate `find . -type f`

Wenn Sie sind in dir/ oder auch

kate `find dir -type f`

Andere Tipps

Es gibt mehrere mögliche Möglichkeiten. Diese Antworten basieren auf dem Szenario, in dem Sie alle Dateien kennen, können durch kate geöffnet werden, und Sie möchten zum Öffnen von Dateien mit allen Erweiterungen.

find dir -type f -exec kate {} +  

kate $(find dir -type f)

kate `find dir -type f`

Die zweite und dritte Formen sind fast gleichwertig. Der Hauptunterschied [1] ist, dass die erste Version von Dateien mit Leerzeichen im Namen behandelt, während die zweiten und dritten nicht.

[1] Dank für diesen Hinweis NVRAM, ich wusste nicht, wenn ich zum ersten Mal der Antwort geschrieben.

kate $(find dir -type f)

Sie sind entweder nicht sehr vertraut mit xargs, oder Sie verwenden es nicht richtig, weil das, was Sie versuchen zu tun, genau das Problem ist xargs entworfen zu lösen: ein beliebig Gegeben lange Liste von Strings, so dass sie als Argumente für ein Programm in möglichst wenigen Hinrichtungen wie möglich passieren, während nicht die Systemgrenzen für die Anzahl der Argumente ein Programm von mehr als nehmen.

Sie haben Recht für find ... -exec, aber das auch fixiert werden kann. Nur + am Ende des find Befehl hinzufügen und voila, verhält es sich wie xargs.

Keine der Lösungen über dieser Verwendung kate $(...) (oder gleichwertig mit Backticks) arbeitet im Allgemeinen (sie keine Dateinamen mit Leerzeichen, werden nicht ausgeführt überhaupt, wenn die Liste der Dateien ist sehr lang unterstützen). Sowohl find ... + und xargs um diese Einschränkungen bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top