なぜ

なぜ

「タイトル」で始まる名前のファイルがいくつかあります。 「.txt」で終わり、その間に他のコンテンツがある場合とない場合があります。たとえば:title.txt、、、title.abc.txttitle.123.txt

今、私はすべて別のフォルダにコピーしたいと思います。 1つのコマンドを使用してcpすべてのファイルをコピーする方法は?

正規表現を使用すると、次の操作を実行できます。

ls | egrep 'title(\..*)*\.txt' | xargs -I{} cp {} destination_folder/

しかし、あまりにも複雑です。egrepとの助けが必要ですxargs。シェルの組み込み関数glob/wildcardを使って魔法を実行する簡単な方法はありますか?それは次のとおりです。

cp title[magic]txt destination_folder/

ベストアンサー1

標準シェルワイルドカードには対応するエントリはありませんが、一部のシェルにはいくつかの拡張機能があります。

扱いにくい

zshでは、これは#次のオプションで有効になる演算子ですextendedglob

set -o extendedglob # best in ~/.zshrc
cp -- *title(.*)#.txt* dest/

eglob修飾子を使用して、globでEREまたはPCREを使用できます。

cp -- *(e['[[ REPLY =~ "title(\..*)*\.txt" ]]']) dest/

set -o rematchpcreEREの代わりにPCREを使用するか、-pcre-match代わりに後で使用)=~zmodload zsh/pcre

ケシ

ksh(すべてのバージョン)では、x*次のようになります*(x)

cp -- *title*(.*).txt* dest/

強く打つ

bashは次のオプションでksh演算子をサポートしますextglob

shopt -s extglob
cp -- *title*(.*).txt* dest/

クッシュ 93

ksh93正規表現は対応するglobで使用できます。

cp -- *~(E:title(\..*)*\.txt)* dest/

(Eのため第二正規表現はここで拡張されます。)

また、次を使用してEREをグローバルモードに変換することもできます。

$ printf '%P\n' 'title(\..*)*\.txt'
*title*(\.*)\.txt*

(このバックスラッシュはここで冗長ですが)

おすすめ記事