Wie wähle ich mit bash bestimmte Dateien in einem anderen Verzeichnis aus?


13

Ich möchte bestimmte Dateien in einem Verzeichnis auflisten (oder löschen oder einen anderen Vorgang ausführen):

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

Wie kann ich das erreichen (ohne vorher in das Verzeichnis zu gehen)?

Antworten:



3

Führen Sie unter bash den Befehl aus shopt -s extglob(oder fügen Sie ihn in Ihren ein ~/.bashrc), und Sie können zusätzliche Muster verwenden , die reguläre Ausdrücke mit einer ungewöhnlichen Syntax (von ksh geerbt) bereitstellen. Sie können diese Muster natürlich auch in ksh und danach auch in zsh verwenden setopt ksh_glob.

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

In zsh können Sie direkt (foo|bar)als Muster verwenden.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Beachten Sie, dass der Befehl mit dem vollständigen Pfad aufgerufen wird. Wenn Sie den Befehl mit einem kurzen Pfad aufrufen möchten, müssen Sie das Verzeichnis irgendwie ändern. Dies (cd /opt/somedir && somecommand aa bb cc)ist bei weitem der einfachste Weg.


Wenn Sie genau hinschauen, werden Sie feststellen, dass ich in meiner Frage "ohne vorher in das Verzeichnis zu
wechseln

1

Sie können filtern mit egrep:

ls | egrep '(aa|bb|cc)'

So finden Sie alle Textdateien:

ls | egrep '(aa|bb|cc).txt'

1
dot
passt zu

1
Ich hatte das Gefühl, dass es sich auch nur um einen Beispielbefehl handelte.
Random832

Ja, Sie haben Recht, ich habe angegeben, dass ich eine Operation ausführen möchte: Das Auflisten von Dateien war nur ein Beispiel.
Neu242

Gute Kommentare, liebe Freunde, danke. Viel Glück neu242: D
Ocean

1

Erstens verweise ich Sie auf: Niemals analysieren , niemals . Der richtige und kanonische Weg, um das zu tun, was Sie wollen, ist mit find .

Beispielsweise:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

Ich benutze in -nameder Regel statt -regexwie es einfacher ist. Aber ein Regex passt zu Ihrem Anwendungsfall. Sie sollten den Befehl ohne -exec das erste Mal ausführen , um sicherzustellen, dass es sich tatsächlich um die Dateien handelt, die Sie verschieben / löschen möchten.


Ich habe nie gesagt, ich würde ls analysieren, und Rush hatte eine weitaus bessere Antwort. Vielen Dank für den Versuch :)
neu242
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.