名前に数字のないファイルをコピーしたい

名前に数字のないファイルをコピーしたい

これはすべてファイルです。

cpコマンドを使用してfile globalを使用して、数値なしですべてのファイルをコピーしたいと思います。

コピーされたファイルには12a、grf3、およびs2dを含めないでください。

使ってみようcp [!0-9] *[!0-9] *[!0-9] destination/

ベストアンサー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と同じ、^xqualifierdotglobと同じで、Dbashには対応するエントリはありません^/。そうでない場合、一致するファイルがない場合は、文字通りfailglob呼び出されたファイルをコピーできます。!(*[0123456789]*)

nullglobPOSIXバージョンの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-namesが*ユーザーロケールでテキストとしてデコードできないバイトシーケンスと一致しない可能性があることを解決します。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

おすすめ記事