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

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

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

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

答え2

POSIXアプローチは、0から9の間にソートされた文字を含むファイルを保存し([0-9];または;で10進数を使用するか、[[:digit:]]0123456789と数字のみを使用[0123456789])、残りをコピーして保存されたセットを復元することです。

mkdir ".save.$$" &&
  mv ./*[0-9]* ".save.$$/"
  cp ./* /target/directory/ &&
  mv ".save.$$"/* . &&
  rmdir ".save.$$"

意図的にドットファイルをコピーしません。これを含めるには、より複雑なソリューションが必要です。

答え3

まあ、これが最善の方法かどうかはわかりませんが、次のように動作します。

cp $(ls --ignore="*[0-9]*") YOUR_DIR

編集する:

(最初のコマンドを使用しない理由についての@StéphaneChazelasのコメントを読んでください。)

これはよりうまく機能するかもしれません:

find . -type f -maxdepth 1 -not -regex '.*[0-9].*' -exec cp {} move \;

答え4

使用幸せ(以前のPerl_6)

raku -e 'for dir(test => none / \d /, ".", "..") { copy $_, $_ ~ ".bak" };'  

RakuはPerlプログラミング言語系列の言語です。上記のRakuコードは、.bak同じディレクトリにバックアップファイルを生成します。これは、次のような興味深い演算子クラス/型を使用します。接合。 Raku言語にはnone、、、oneおよび4つの結合タイプがありますanyall

~$ ls
persons.txt places.txt  thx1138.txt 
~$ perl6 -e 'for dir(test => none / \d /, ".", "..") { copy $_, $_ ~ ".bak" };'
~$ ls
persons.txt persons.txt.bak places.txt  places.txt.bak  thx1138.txt 

上記(特に)は、none次の3つの項目のJunctionのリストを提供します。

  1. 数値を含むファイル名\d(正規表現マッチングを使用)、
  2. "."ディレクトリをクリックして、
  3. ピアツーピア".."ディレクトリ。

正しいファイル名が選択されると、ファイル名の後に(Rakuで文字列を連結するために使用される単一のチルダ文字)で構成されるバックアップファイルにチャンクがコピーされ$_ます。copy.bak~


別のディレクトリへのバックアップ/コピー:

Rakuには、ファイルを別のディレクトリにコピーおよび/またはバックアップするためのいくつかのオプションがあります。 aはpathadirnameとで構成されていることに注意してくださいbasename。ある時点では、パスのabsolute代わりにパスをインポートしたい場合があります。または、昇順パスを使用して(の同義語)を使用してパスにディレクトリを追加することもできます。ヒントについては、下記の「入力/出力の最終ガイド」リンクをご覧ください。relativeresolveparentaddchild

これを行う1つの方法は次のとおりです(バックアップ/Tmpディレクトリにコピーし、元のファイル名は変更されません)。

~$ raku -e 'my $Cwd = $*CWD;  \
            mkdir(my $Tmp = $Cwd.parent.add: "/Tmp/"); \
            for $Cwd.dir(test => none / \d /, ".", "..") { 
              copy $_,  IO::Path($Tmp ~ $_.basename) 
            };'
~$ cd ../Tmp
~$ ls
persons.txt places.txt

https://docs.raku.org/type/IO/Path
https://docs.raku.org/言語/io-guide#Input/Output_the_definitive_guide

関連情報