次のように、ディレクトリ内の一部のファイルを一覧表示(または削除または他の操作を実行)したいと思います。
$ 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に移動せずに)これを達成するにはどうすればよいですか?
答え1
答え2
bashで実行shopt -s extglob
(またはこれをあなたのものに入れてください~/.bashrc
)。他のものを使用することができます模様珍しい構文(kshから継承)で正規表現を提供します。もちろん、kshでもこれらのモードを使用でき、zsh以降もこれらのモードを使用できますsetopt ksh_glob
。
$ 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)
最も簡単な方法です。
答え3
以下を使用してフィルタリングできますegrep
。
ls | egrep '(aa|bb|cc)'
すべてのテキストファイルを見つけるには:
ls | egrep '(aa|bb|cc).txt'
答え4
まずご案内いたします。lsを決して解析しないでください、一度。目的のタスクを実行する正確で正式な方法は次のとおりです。探す。
たとえば、
find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;
私は通常より簡単なので、-name
代わりに使用します。-regex
ただし、正規表現はユースケースに適しています。コマンドを実行する必要がありますいいえ -exec
移動/削除したいファイルが正しいことを初めて確認してください。