한 디렉터리의 모든 파일(숨겨진 파일 포함)을 다른 디렉터리로 이동하는 방법은 무엇입니까?
예를 들어 ".hidden" 및 "notHidden" 파일이 포함된 "Foo" 폴더가 있는 경우 이 두 파일을 "Bar"라는 디렉터리로 어떻게 이동할 수 있습니까? ".hidden" 파일이 "Foo"에 남아 있기 때문에 다음은 작동하지 않습니다.
mv Foo/* Bar/
직접 시도해 보세요.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
답변1
빠른 답변을 먼저 확인하세요. bash, ksh93 및 zsh에 대한 자세한 토론 및 문서 링크는 아래를 참조하세요.
지쉬
mv Foo/*(DN) Bar/
또는
setopt glob_dots null_glob
mv Foo/* Bar/
옵션 이름의 대소문자와 밑줄은 무시됩니다. set -o
Korn/POSIX 유사 쉘에서도 사용할 수 있으며 dotglob
GNU 쉘(bash)과의 호환성을 위해 (DotGlob, DOT_GLOB...)도 지원합니다.
불다
shopt -s dotglob nullglob
mv Foo/* Bar/
kensh93
디렉토리가 비어 있지 않다는 것을 알고 있는 경우:
FIGNORE='.?(.)'
mv Foo/* Bar/
물고기
디렉토리가 비어 있지 않다는 것을 알고 있는 경우:
mv Foo/{.,}* Bar/
표준(POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
mv
명령이 성공하더라도 오류 상태를 반환하도록 하려는 경우 훨씬 더 간단합니다.
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU 찾기 및 GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
표준 검색
find Foo/. ! -name . -prune -exec sh -c 'mv -- "$@" "$0"' ../Bar/ {} +
bash, ksh93 및 zsh에서 제어 지점 파일이 일치하는지 여부에 대한 자세한 내용은 다음과 같습니다.
불다
설정dotglob
옵션.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
더 유연해요GLOBIGNORE
바꾸다, 무시할 와일드카드 패턴의 콜론으로 구분된 목록으로 설정할 수 있습니다. 설정되지 않은 경우(기본값) dotglob
값이 설정된 경우 셸은 값이 비어 있는 것처럼 동작하고, .*
옵션이 설정되지 않은 경우 셸은 값이 비어 있는 것처럼 동작합니다. 바라보다파일 이름 확장자설명서에. 유니버설 디렉터리 .
는 패턴과 명시적으로 일치 ..
하지 않는 한 항상 생략됩니다 ..
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
kensh93
설정FIGNORE
바꾸다. 설정하지 않으면(기본값) 쉘은 이 값이 인 것처럼 동작합니다 .*
. .
sum 을 무시하려면 ..
명시적으로 일치해야 합니다(ksh 93s+ 2008-01-31의 매뉴얼에서는 .
sum이 ..
항상 무시된다고 명시되어 있지만 더 이상 실제 동작을 올바르게 설명하지 않습니다.편집하다 이 문제는 해결되었습니다.).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
도트 파일을 포함할 수 있습니다.무늬명시적으로 일치시킵니다.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
디렉토리가 비어 있을 때 확장자를 비우려면 N
패턴 일치 옵션인 ~(N)@(*|.[^.]*|..?*)
또는 를 사용하십시오 ~(N:*|.[^.]*|..?*)
.
지쉬
설정dot_glob
옵션.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
.
..
패턴이 .
선행과 명시적으로 일치 하더라도 절대 일치 하지 않습니다.
% echo .*
..two .one
다음 명령을 사용하여 특정 패턴으로 도트 파일을 포함할 수 있습니다.D
글로벌 예선.
% echo *(D)
..two .one none zero
N
확장이 빈 디렉터리에 비어 있는 것처럼 보이도록 하려면 glob 한정자를 추가하세요 *(DN)
.
참고: 및 변수가 설정되는 방식에 따라 파일 이름 확장 결과가 다른 순서로 나타날 수 있습니다(예 none
: .one
...two
LC_COLLATE
LC_ALL
LANG
답변2
#!/bin/bash
shopt -s dotglob
mv Foo/* Bar/
~에서man bash
페널티 킥설정된 경우 bash는 경로 이름 확장 결과에 "."로 시작하는 파일 이름을 포함합니다.
답변3
이를 수행하는 간단한 방법은 bash
다음과 같습니다.
mv {Foo/*,Foo/.*} Bar/
그러나 이렇게 하면 디렉토리도 이동됩니다.
모든 파일(숨겨진 파일 포함)을 이동하고 디렉터리는 이동하지 않으려면 for 루프를 사용하여 테스트할 수 있습니다.
for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;
답변4
나는 이것이 bash와 잘 작동하고 쉘 옵션을 변경할 필요가 없다는 것을 알았습니다.
mv sourcedir/{*,.[^.]*} destdir/
편집하다:
따라서 G-man이 말했듯이 내 초기 답변은 posix를 준수하지 않으며 위의 ndemou의 답변과 거의 동일합니다. 한 가지 변경 사항은 중괄호 확장을 사용하여 수행되는 문자열 목록을 만드는 것입니다. 이는 cd
소스 디렉터리로 이동할 필요가 없다는 의미입니다 . 별로는 아니지만 뭔가 다릅니다.
예: 이미 다음 레이아웃이 있다고 가정합니다.
$ tree -a
.
├── destdir
└── sourcedir
├── ..d1
├── ..d2
├── ..double
├── file-1
├── file-2
├── .hidden-1
├── .hidden-2
├── ...t1
└── ...t2
원래 질문에서는 마침표가 하나인 숨겨진 파일만 언급했지만 시작 부분에 마침표가 두 개 이상인 파일 이름이 있다고 가정합니다. 중괄호 안에 추가 표현식을 추가하기만 하면 됩니다. 그러면 우리는 실행할 수 있습니다
mv sourcedir/{*,.[!.]*,..?*} destdir/
이는 다음으로 확장됩니다.
mv sourcedir/file-1 sourcedir/file-2 sourcedir/.hidden-1 sourcedir/.hidden-2 sourcedir/..d1 sourcedir/..d2 sourcedir/..double sourcedir/...t1 sourcedir/...t2 destdir/
이제 다음 위치에 있는 모든 파일을 볼 수 있습니다.대상 디렉토리:
$ tree -a
.
├── destdir
│ ├── ..d1
│ ├── ..d2
│ ├── ..double
│ ├── file-1
│ ├── file-2
│ ├── .hidden-1
│ ├── .hidden-2
│ ├── ...t1
│ └── ...t2
└── sourcedir
Bash에서는 중괄호를 사용하여 정말 멋진 작업을 수행할 수 있으며 4.x에는 더 많은 기능이 추가되었습니다. 확인하다배쉬 해커몇 가지 아름다운 예입니다.