bashを使用して別のディレクトリにある特定のファイルを選択するにはどうすればよいですか?


13

次のように、ディレクトリ内の特定のファイルを一覧表示(または削除、またはその他の操作)したいです。

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

どのようにこれを達成できますか(最初にディレクトリにcdすることなく)?

回答:



3

bashの下で実行shopt -s extglob(またはに挿入)すると、(kshから継承された)異常な構文を持つ正規表現を提供~/.bashrcする追加のパターンを使用できます。もちろん、これらのパターンはkshでも使用できますsetopt ksh_glob。また、zsh以降でも使用できます。

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

zshでは(foo|bar)、パターンとして直接使用できます。

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

コマンドはフルパスで呼び出されることに注意してください。短いパスでコマンドを呼び出したい場合(cd /opt/somedir && somecommand aa bb cc)は、何らかの方法でディレクトリを変更する必要がありますが、これがはるかに簡単な方法です。


よく見ると、私の質問で「最初にディレクトリにcd-ingせずに」と指定していることがわかります;)
neu242

1

次を使用してフィルタリングできますegrep

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

すべてのテキストファイルを検索するには:

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

1
ドットは、すべての文字にマッチし、さらにこれらのファイルを操作するために、このアプローチは、それが困難に
enzotib

1
私もlsが単なるコマンドの例だと感じました。
ランダム832

うん、あなたは正しい、私は私が操作を実行したいことを指定しました:ファイルのリストは単なる例でした。
neu242

親愛なる友人、良いコメント、ありがとう。幸運neu242:D
オーシャン

1

まず、次のように指示します:lseverを解析しないでください。あなたがしたいことをするための適切で標準的な方法は findです。

例えば:

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

私は通常、より単純なので-name代わりに使用します-regex。しかし、正規表現はユースケースに適合します。実際に移動/削除したいファイルであることを確認するために、初めてコマンド 実行する必要-execはありません。


lsを解析するとは決して言わなかったので、Rushの方がはるかに良い答えがありました。試してくれてありがとう:)
neu242
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.