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)?

neu242
quelle

Antworten:

22

Verwenden Sie dafür geschweifte Klammern:

ls /opt/somedir/{aa,bb,cc}

Weitere Informationen finden Sie unter Klammererweiterung .

eilen
quelle
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.

Gilles 'SO - hör auf böse zu sein'
quelle
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'
Ozean
quelle
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.

Spencer Rathbun
quelle
Ich habe nie gesagt, ich würde ls analysieren, und Rush hatte eine weitaus bessere Antwort. Vielen Dank für den Versuch :)
neu242