모든 파일을 지정할 수 있는 방법이나 파일 조작 방법이 mv
있습니까 ?cp
아니요영향을 받고 싶나요?
예를 들어, 파일이 포함된 폴더가 file1
있고 어딘가로 이동하고 싶다고 가정해 보겠습니다 . 이동하려는 파일의 이름을 명시적으로 지정하는 대신( ) 파일 이름을 지정하고 싶습니다.file2
file3
file1
file2
mv file1 file2 /path/to/destination
아니요폴더( mv --some-switch file3 /path/to/destination
) 의 다른 모든 항목을 이동하고 이동합니다.
답변1
일부 셸에서는 고급 와일드카드 패턴을 사용하여 특정 패턴과 일치하는 파일을 제외하고 디렉터리의 모든 파일을 일치시킬 수 있습니다. 예를 들어 ksh, bash 또는 zsh에서는 다음 명령을 사용합니다.
shopt -s extglob ## needed in bash only setopt ksh_glob ## needed in zsh only mv /source/!(*.bak) /destination
일치하는 파일을
/source
제외한 모든 파일을 이동합니다 . zsh에서는 if to run first 를 작성할 수도 있고 , 더 일반적으로 다시 필요한 경우 ( 또는 이름이 Except files 등으로 시작하는 모든 파일에 대해) 작성할 수도 있습니다./destination
*.bak
/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'
float 라는 명령이 여러 개 있습니다
rename
. Debian 및 Ubuntu에서/usr/bin/rename
Perl 표현식에 의해 생성된 새 이름으로 파일을 이동하는 Perl 스크립트입니다. 파일을 제외하려는 경우 새 이름을 생성하지 않음으로써 파일 이름 바꾸기를 제외할 수 있습니다. 예를 들어, 다음 명령(이 특정 프로그램 사용)은rename
from을 제외한 모든 파일을 다음으로 이동합니다.*.bak
/source
/target
rename 's!/source!/target! unless m!\.bak$!' /source/*
이
find
명령을 사용하여 이동할 파일을 선택할 수 있습니다. 예를 들어, 다음 명령은 또는 하위 디렉터리를 제외한 모든 일반 파일을 다음으로*.bak
이동 합니다 (디렉터리 구조는 축소되어 있습니다)./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
에 복사합니다./source
/target
rsync -a --exclude '*.bak' /source/ /target/
pax
(무엇보다도) 또 다른cp
스테로이드입니다. 제외 규칙은 rsync만큼 강력하지는 않지만 파일이 복사될 때 이름을 바꾸는 추가 기능이 있습니다. 파일 이름을 빈 문자열로 바꾸면 복사본에서 제외됩니다. 예를 들어 다음 명령은 또는 하위 디렉터리를 제외한 모든 파일을*.bak
에 복사 하고 파일 이름을 로 바꿉니다 ./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/