한 디렉터리에서 다른 디렉터리로 모든 파일(숨겨진 파일 포함)을 이동하는 방법은 무엇입니까?

한 디렉터리에서 다른 디렉터리로 모든 파일(숨겨진 파일 포함)을 이동하는 방법은 무엇입니까?

한 디렉터리의 모든 파일(숨겨진 파일 포함)을 다른 디렉터리로 이동하는 방법은 무엇입니까?

예를 들어 ".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 -oKorn/POSIX 유사 쉘에서도 사용할 수 있으며 dotglobGNU 쉘(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...twoLC_COLLATELC_ALLLANG

답변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에는 더 많은 기능이 추가되었습니다. 확인하다배쉬 해커몇 가지 아름다운 예입니다.

관련 정보