「タイトル」で始まる名前のファイルがいくつかあります。 「.txt」で終わり、その間に他のコンテンツがある場合とない場合があります。たとえば:title.txt
、、、title.abc.txt
。title.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/
e
glob修飾子を使用して、globでEREまたはPCREを使用できます。
cp -- *(e['[[ REPLY =~ "title(\..*)*\.txt" ]]']) dest/
(set -o rematchpcre
EREの代わりに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*
(このバックスラッシュはここで冗長ですが)