일부 셸에서 고급 글 로빙 패턴을 사용하여 특정 패턴과 일치하는 파일을 제외하고 디렉토리의 모든 파일을 일치시킬 수 있습니다. 예를 들어 ksh, bash 또는 zsh에서
shopt -s extglob ## needed in bash only
setopt ksh_glob ## needed in zsh only
mv /source/!(*.bak) /destination
일치하는 파일 /source
을 /destination
제외한 모든 파일을 이동합니다 *.bak
. zsh에서는 /source/^*.bak
처음 실행 setopt extended_glob
하고 더 일반적으로 (다시 요구해야 함 setopt extended_glob
) /source/*~*.bak
(또는 /source/a*~*.bak
파일을 a
제외하고 이름이 시작하는 모든 파일에 대해 ) 쓸 수도 있습니다 .bak
.
Zsh에는 패턴과 일치하는 파일을 제외한 모든 파일을 이동하는 데 사용할 수있는 대량 복사 / 이동 / 링크 명령이 있습니다. 예를 들어 다음 명령은 *.bak
from /source
을 제외한 모든 파일을 이동 하고 프로세스에서 해당 파일 이름에 target
추가 .bak
합니다.
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
rename
플로팅 이라는 몇 가지 명령이 있습니다 . 데비안과 우분투에서 /usr/bin/rename
펄 스크립트는 파일을 펄 표현식에 의해 생성 된 새로운 이름으로 옮기는 펄 스크립트입니다. 파일을 제외 할 경우 새 이름을 생성하지 않으면 파일 이름 바꾸기에서 제외 할 수 있습니다. 예를 들어 다음 명령 (이 특정 rename
프로그램 사용)은 *.bak
에서 /source
를 제외한 모든 파일 을 /target
다음으로 이동합니다 .
rename 's!/source!/target! unless m!\.bak$!' /source/*
find
명령을 사용하여 이동할 파일을 선택할 수 있습니다 . 예를 들어 다음 명령은 *.bak
in /source
또는 하위 디렉토리를 제외한 모든 일반 파일을 디렉토리로 이동합니다 /target
(디렉토리 구조가 축소됨).
find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
또는 (이동할 파일이 많은 경우 더 효율적)
find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
rsync
의 일반화 cp
와 scp
매우 강력한 / 포함 규칙을 제외와 함께. 예를 들어, 다음 명령 은 디렉토리 구조 와 관련하여 *.bak
in /source
또는 서브 디렉토리를 제외한 모든 파일을로 복사합니다 /target
.
rsync -a --exclude '*.bak' /source/ /target/
pax
cp
스테로이드의 다른 것 입니다. 제외 규칙은 rsync만큼 강력하지는 않지만 파일을 복사 할 때 이름을 바꿀 수있는 추가 기능이 있습니다. 파일 이름을 빈 문자열로 바꾸면 복사본에서 제외됩니다. 예를 들어, 다음 명령 *.bak
은 in /source
또는 서브 디렉토리를 제외한 모든 파일을로 복사하고 전달시 /target
파일 이름을 바꿉니다 .bak
.
cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
위의 예는 다음 과 foo.bak
결합 find
하여 피할 수있는 이라는 디렉토리를 만들면 불행한 부작용 이 있습니다 pax
.
{ cd /source && find . -type f; } | \
pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
mv file1 file2 /path/to/destination
그것이 당신이 원하는 것을하지 않을 것이라고 믿습니다