Jak wybrać określone pliki w innym katalogu za pomocą bash?


13

Chcę wyświetlić listę (lub usunąć lub wykonać inną operację) dla niektórych plików w katalogu, na przykład:

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

Jak mogę to osiągnąć (bez wcześniejszego cd-do katalogu)?

Odpowiedzi:



3

Pod bash uruchom shopt -s extglob(lub umieść go w swoim ~/.bashrc), i możesz użyć dodatkowych wzorców, które zapewniają wyrażenia regularne o nietypowej składni (dziedziczone z ksh). Oczywiście możesz używać tych wzorów także w ksh, a także w zsh później setopt ksh_glob.

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

W Zsh możesz bezpośrednio użyć (foo|bar)jako wzorca.

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

Zauważ, że polecenie jest wywoływane z pełną ścieżką. Jeśli chcesz wywołać polecenie krótką ścieżką, musisz jakoś zmienić katalog i (cd /opt/somedir && somecommand aa bb cc)jest to zdecydowanie najłatwiejszy sposób.


Jeśli przyjrzysz się uważnie, zobaczysz, że w moim pytaniu określam „bez najpierw cd-do katalogu”;)
neu242

1

Możesz filtrować za pomocą egrep:

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

Aby znaleźć wszystkie pliki tekstowe:

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

1
kropka będzie pasować do każdej postaci, a takie podejście utrudnia dalszą obsługę tych plików
enzotib

1
Mam wrażenie, że ls też było tylko przykładem.
Random832,

Tak, masz rację, określiłem, że chcę wykonać operację: wyświetlanie plików to tylko przykład.
neu242,

Dobre komentarze drodzy przyjaciele, dzięki. Powodzenia neu242: D
Ocean

1

Po pierwsze, kieruję cię do: nigdy nie parsuj ls , nigdy . Właściwym i kanonicznym sposobem robienia tego, co chcesz, jest znalezienie .

Na przykład:

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

Zwykle używam -namezamiast, -regexponieważ jest to prostsze. Ale wyrażenie regularne pasuje do Twojego przypadku użycia. Powinieneś uruchomić polecenie bez -exec pierwszego uruchomienia, aby upewnić się, że faktycznie są to pliki, które chcesz przenieść / usunąć.


Nigdy nie powiedziałem, że przeanalizuję, a Rush miał znacznie lepszą odpowiedź. Dzięki za próbę :)
neu242,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.