디렉터리의 일부 파일을 복사하려고 합니다. 이 디렉터리에는 다음 파일이 포함되어 있습니다.
내 현재 디렉토리는 ~/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 \;
파일을 이동하되, !
이름이 ( ) -name
my.war ( "my.war"
)인 파일을 my.war 주위에 따옴표로 묶어서 이동하면 .
쉘이 해당 파일을 해석하지 못하게 됩니다.