Linux에서 cp 명령으로 정규식을 어떻게 사용합니까?


22

cp그러나 메시지와 함께 인사를 사용하여 한 디렉토리에서 다른 디렉토리로 파일의 서브 세트 만 복사하려고 합니다 cp: cannot stat [^\.php]': No such file or directory. cp명령을 사용하여 정규 표현식을 사용하는 방법이 있습니까?

답변:


29

아니.

cp명령에는 인수를 정규식으로 처리 할 수있는 기능이 없습니다. 와일드 카드조차도 (또는 대부분의 실행 파일) 처리하지 않습니다. 오히려 그들은 쉘에 의해 처리됩니다.

cp test/* test2/실제로 bash에 의해 확장되며 cp인수에 실제로 보이는 모든 것은 cp test/file1 test/file2 test/file3 test2/(또는 실제 내용에 따라 적절한 것 test/)입니다.

또한, 나는 당신의 표현 [^\.php]이 당신이 원하는 것과 일치 한다고 생각하지 않습니다 (그것은 포함 된 파일과는 일치하지 않습니다 .php).

find정규식을 기반으로 파일 목록을 필터링하기 위해 유틸리티를 조사한 다음 xargs리턴 된 파일 목록을 cp명령 에 적용하는 데 사용 하려고합니다 (찾기에는 파일 복사를위한 내장 핸들러가 없다고 가정). m 공구에 친숙하지 않습니다).

시도해 볼 수 있습니다 :

find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;

이것은 경로에 ".php"가 포함되지 않은 파일을 현재 디렉토리에서 재귀 적으로 검색하여에 복사하는 것 /destination/folder/입니다.

요청에 따라 더 구체적인 인수 분석 :

  • . -검색을 시작할 위치-이 경우 현재 디렉토리
  • ! - "Not"연산자, 다음 테스트 결과 반전
  • -iregex-대소 문자를 구분하지 않는 정규식 테스트. 다음은 표현입니다.
  • ".*\.php.*"-정규식 일치 <Anything>.php<Anything>-경로 어딘가에 ".php"가있는 파일. (이름에 ".php"가 포함 된 폴더 안에있는 것을 포함하여 파일 만 일치시키기 위해서는 더 복잡한 표현이 필요합니다)
  • -exec-위의 테스트에서 true를 반환하면 명령을 실행하십시오. 다음 인수는 명령이며 나머지 모든 인수는 명령 ;으로 전달됩니다. 는 {}파일 이름을 나타내는 특수 인수입니다.
  • cp -찾은 명령은 일치하는 각 경로 이름에서 실행해야합니다.
  • {}-찾은 파일의 경로, cp복사 할 파일을 알 수 있도록 인수로 전달
  • /destination/folder/- 인수에 전달 cp말하고, cp이 파일을 복사 할 위치.
  • \;-이것은 찾고 있는 ;터미네이터입니다 -exec. 우리는 \쉘이 구문 분석하려고하지 않고 대신 명령에 대한 인수로 피드하도록 ( find)

그것은 "이없는 문자열과 일치하는 정규 표현식을 작성하는 다소 어려운 .php우리가 대신 말해 그래서," find문자열을 검색 포함 .php와 결과 반전 다음과 !.


2
find . -name [^\.php] -exec cp {} /path/to/location \;특수 문자가있는 파일에주의하십시오.
Rob

@Darth Android-감사합니다. 나는 cp다른 바이너리가 정규 표현식을 확장 할 수 없다는 것을 알지 못했습니다. 샘플 예제에서 각 옵션과 인수가 무엇을 의미하는지 자세히 설명해 주시겠습니까? 나는 알고 .현재 디렉토리를 의미하지만, 무엇을 !, {}, \;, 등 그들이 무엇을 의미하는지 잘으로 참조? 예를 들어 왜 ;? 를 피해야 합니까?
PeanutsMonkey 2016 년

@Rob-특수 파일이란 무엇입니까?
PeanutsMonkey 2016 년

@Rob-특정 파일을 제거하기 위해 비슷한 표현을 시도했지만 디렉토리의 모든 파일이 삭제되었습니다. 내 명령은 find . -name '[^\.txt]' -exec rm {} \;따라서 사용을 꺼려했다 find. 아마도 내 실수 일지 모르지만 내가 뭘 잘못했는지 확실하지 않습니다. 내가 이해 {}하는 한, 명령으로 찾은 각 파일을 참조하십시오find . -name '[^\.txt]'
PeanutsMonkey

정규식과 일치 시키려고 무엇입니까?
Rob

10

grep 및 xargs와 같은 콘솔에서 다른 도구를 거의 사용할 수 없습니다.

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder

어떻게 {}의 그것과 다른 -t?
PeanutsMonkey

2
이 경우에는별로 없습니다. xargs의 대체 구문은 'xargs cp {} destination_folder'입니다. 표준 cp 구문은 결국 하나 이상의 소스와 하나의 대상을 취합니다. -t 옵션을 사용할 때 -t 뒤에 대상을 지정한 다음 소스의 나머지 행을 사용할 수 있습니다. 이 경우 -t 옵션이 더 편리하다는 것을 알았습니다. 다른 예에서 {}은 xargs (stdin)로 파이프 된 파일 (이 경우 파일 이름)로 대체됩니다.
0xAF

-1

사용하기 쉬운 다음 명령을 실행할 수 있습니다.

find /home/usr/search_dir -iname *file_name_portion*.txt | xargs cp -t /home/usr/destination_folder

멋진 하아 !!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.