디렉토리의 특정 파일 복사

디렉토리의 특정 파일 복사

디렉터리의 일부 파일을 복사하려고 합니다. 이 디렉터리에는 다음 파일이 포함되어 있습니다.

내 현재 디렉토리는 ~/certificate/

drwxrwxr-x 2 ubuntu ubuntu     4096 Oct 16 11:58 apache
-rw-rw-r-- 1 ubuntu ubuntu     5812 Oct 16 11:20 apache.keystore
-rw-rw-r-- 1 ubuntu ubuntu     1079 Oct 16 08:31 csr.txt
-rwxr-xr-x 1 ubuntu ubuntu 36626564 Oct 16 10:08 my.war
drwxrwxr-x 2 ubuntu ubuntu     4096 Oct 16 09:39 tomcat
-rw-rw-r-- 1 ubuntu ubuntu     6164 Oct 16 09:31 tomcat.keystore

my.war을 제외한 모든 파일을 ~/certs/에 복사하고 싶습니다. 명령을 따르려고 시도했지만 성공하지 못했습니다. 일시적이라도 my.war을 폴더 밖으로 옮기고 싶지 않습니다.

cp -r ~/certificate/(?!m)* ~/cert/. 

적절한 정규식이나 기타 도구를 사용하여 도와주세요.

답변1

이식 가능한 파일 이름 와일드카드 패턴에는 몇 가지 제한 사항이 있습니다. "이 파일을 제외한 모든 파일"을 표현하는 방법은 없습니다.

여기에 표시된 파일의 경우 첫 번째 문자 ~/certificate/[!m]*("문자가 아닌 문자로 시작하는 모든 파일 이름 m") 또는 마지막 문자를 일치시킬 수 있습니다 ~/certificate/*[^r].

복사할 파일 목록을 미세 조정해야 하는 경우 를 사용하면 하위 디렉터리로 반복되는 것을 방지 find할 수 있습니다.-type d -prune

cd ~/certificates &&
find . -name . -o -type d -prune -o ! -name 'my.war' -name 'other.exception' -exec sh -c 'cp "$@" "$0"' ~/cert {} +

ksh를 사용하는 경우 확장된 glob 모드를 사용할 수 있습니다.

cp ~/certificates/!(my.war|other.exception) ~/cert

bash를 먼저 실행하면 동일한 명령을 bash에서 사용할 수 있습니다 shopt -s extglob. zsh를 먼저 실행하면 동일한 명령을 zsh에서 실행할 수 있습니다 setopt ksh_glob. zsh에는 대체 구문이 있습니다: run setopt extended_glob다음에 다음 중 하나가 옵니다.

cp ~/certificates/^(my.war|other.exception) ~/cert
cp ~/certificates/*~(my.war|other.exception) ~/cert

또는 pax 또는 rsync와 같은 제외 목록이 있는 복제 도구를 사용하십시오. Pax는 기본적으로 재귀적입니다. 이 옵션을 사용하여 -d디렉토리를 복사할 수 있지만 내용은 복사할 수 없습니다.

rsync --exclude='my.war' --exclude='other.exception' ~/certificates/ ~/cert/

pax -rw -s '!/my\.war$!!' -s '!/other\.exception$!!' ~/certificates/ ~/cert/

답변2

다음 명령을 사용할 수 있습니다.

$ cp -R ~/certificate/[act]* ~/certs/.

나는 보통 쉘 볼을 테스트하기 위해 이와 같은 작업을 수행합니다.

$ echo certificate/[act]*
certificate/apache certificate/apache3.keystore certificate/csr.txt certificate/tomcat certificate/tomcat.keystore

쉘 글로브는 실제로 정규 표현식이 아니며 패턴이라고 생각합니다.

패턴 매칭

Bash의 패턴 일치 도구는 Bash 매뉴얼 페이지의 다음 섹션에 잘 설명되어 있습니다."패턴 매칭".

답변3

find ~/certificates -type d -name '*' -exec mkdir -p ~/certs/{} \;

디렉토리 이동

find ~/certificates ! -filetype f ! -name "my.war" -exec cp "{}" ~/cert \;

파일을 이동하되, !이름이 ( ) -namemy.war ( "my.war")인 파일을 my.war 주위에 따옴표로 묶어서 이동하면 .쉘이 해당 파일을 해석하지 못하게 됩니다.

관련 정보