이름에 숫자가 없는 파일을 복사하고 싶어요

이름에 숫자가 없는 파일을 복사하고 싶어요

이게 다 파일이에요

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/하나 이상의 ASCII 10진수 시퀀스(무제한 <->형식)와 일치합니다.<x-y>

( ^부정 연산자로 D숨겨진 파일이 포함되고 ^/디렉토리 유형의 파일도 제외되므로 // 없이는 복사가 거부됩니다 cp.)-r-R-a

bash같은

shopt -s extglob failglob dotglob
cp -- !(*[0123456789]*) /path/to/destination/

!(x)(ksh에서, extglob이를 사용하는 코드를 읽을 때 설정해야 함) zsh와 동일하고 ^xqualifier dotglob와 동일하며 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]; 또는 ; 와 함께 십진수 사용 [[: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가지 조인 유형이 있습니다 any.all

~$ 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 는 patha dirname와 로 구성되어 있음을 알아두세요 basename. 어떤 시점에서는 경로 absolute대신 경로를 가져오고 싶을 수도 있습니다 . 또는 오름차순 경로를 사용하고 (의 동의어)를 사용하여 경로에 디렉터리를 추가할 수 있습니다. 팁을 보려면 아래의 "입력/출력에 대한 최종 가이드" 링크를 참조하세요.relativeresolveparentaddchild

이를 수행하는 한 가지 방법은 다음과 같습니다(백업 /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

관련 정보