ベストアンサー1
そしてzsh
:
set -o extendedglob
cp -- ^*<->*(D^/) /path/to/destination/
または、cp -- ^*[0-9]*(D^/) destination/
1つ以上のASCII 10進数シーケンス(無制限<->
形式)と一致します。<x-y>
(^
否定演算子としてD
隠されたファイルが含まれ、^/
ディレクトリタイプのファイルも除外されるため、//なしではコピーは拒否されますcp
。)-r
-R
-a
bash
同じ
shopt -s extglob failglob dotglob
cp -- !(*[0123456789]*) /path/to/destination/
!(x)
(kshでは、extglob
それを使用するコードを読み取るときに設定する必要があります)zshと同じ、^x
qualifierdotglob
と同じで、D
bashには対応するエントリはありません^/
。そうでない場合、一致するファイルがない場合は、文字通りfailglob
呼び出されたファイルをコピーできます。!(*[0123456789]*)
nullglob
POSIXバージョンのglobを使用することは常に実装するのが非常に困難でした。 glob修飾子やそれに対応する、failglob
(zshの基本動作)またはglobdot
//修飾子もなくkshスタイルやzshスタイル否定演算子もないからdotglob
ですD
。
set -- [*] *
[ "$1$2" = '[*]*' ] && shift
shift
set -- .[*] .* "$@"
[ "$1$2" = '.[*].*' ] && shift
shift
for file do
case "$file" in
(*[0123456789]* | . | ..) ;;
(*) [ -d "$file" ] && [ ! -L "$file" ] || set -- "$@" "$file";;
esac
shift
done
[ "$#" -gt 0 ] && echo cp -- "$@" /path/to/destination/
ただし、以下を使用できますfind
。
LC_ALL=C find . ! -name . -prune ! -name '*[0-9]*' ! -type d \
-exec sh -c 'exec cp "$@" /path/to/destination/' sh {} +
LC_ALL=C
-name
sが*
ユーザーロケールでテキストとしてデコードできないバイトシーケンスと一致しない可能性があることを解決します。C
ロケール内でも[0-9]
同じ[0123456789]
です。ただし、これは、一部の文字のエンコードにASCII番号のバイト値が含まれているBIG5やGB18030などの文字セットでエンコードされたファイル名を除外できることを意味します。中国と顧客国以外の地域では可能性が低い。
zsh
テキストのみで構成されていない文字セットまたはファイル名を使用して、ロケールとファイル名を処理できる必要があります。bash
また、ファイル名を完全にデコードできない場合は、バイトごとの一致に切り替えます。これは、上記のBIG5 / GB18030と同じ状況を含むいくつかの特別な場合に驚くべき結果をもたらす可能性があります。
zsh
' は[0-9]
常に bash と同じで、[0123456789]
C/POSIX ロケールの外ではほとんど発生しません。
あなたの:
cp [!0-9] *[!0-9] *[!0-9] 対象
次の理由で機能しません。
[!0-9]
: ファイル名は、0 から 9 までの順序を除く単一文字です。これらの単一文字がない場合、予約されたファイル名は、bash
使用されていないか、failglob
有効になっていない場合は2桁のファイル名です。nullglob
[!0-9]
*[!0-9]
:0〜9の順序ではなく、文字で終わるファイル名です。1234567X
たとえば、So が一致します。*[!0-9]
繰り返しますが、これは誤字のようです。しかし、あなたが意図した場合は[!0-9]*
一致しますX12345
。あなたが意味する場合は*[!0-9]*
一致します1234X5678
。
regexpと同等^[^0-9]*$
またはより良いことを意味する場合、regexp^[^0123456789]*$
は*
0以上を意味します。前のこと0以上の代わりに数値*([!0123456789])
globでは、Kornスタイルの拡張glob(bashでもサポートされていますextglob
)または[^0-9]#
zsh拡張globになります。 EREに対応するものについては、+([!0123456789])
(ksh)と(zsh)も参照してください(とにかくファイル名が空ではないため、ここには影響しません)。[^0-9]##
+
--
また、オプションの終わりを表示するのを忘れた場合に始まるすべてのファイル名は-
オプションとして扱われますcp
。たとえば、-rt..
GNUというファイルの場合、他のすべてのファイルは最終的に親ディレクトリに繰り返しcp
コピーされます。/path/to/destination