it-swarm.dev

한 디렉토리에서 다른 디렉토리로 모든 파일 (숨김 포함)을 어떻게 이동합니까?

디렉토리의 모든 파일 (숨겨진 파일 포함)을 다른 디렉토리로 어떻게 이동합니까?

예를 들어, ".hidden"및 "notHidden"파일이있는 "Foo"폴더가있는 경우 "Bar"라는 디렉토리로 두 파일을 어떻게 이동합니까? ".hidden"파일이 "Foo"로 유지되므로 다음은 작동하지 않습니다.

mv Foo/* Bar/

직접 해보십시오.

mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
155
Cory Klein

Zsh

mv Foo/*(DN) Bar/

또는

setopt -s glob_dots
mv Foo/*(N) Bar/

(디렉토리가 비어 있지 않다면 (N)를 그대로 두십시오.)

Bash

shopt -s dotglob nullglob
mv Foo/* Bar/

Ksh93

디렉토리가 비어 있지 않다는 것을 알고있는 경우 :

FIGNORE='.?(.)'
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/ -- {} +

표준 찾기

소스 디렉토리로 변경하지 않아도되는 경우 :

cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "[email protected]" "$0"' ../Bar/ {} + -type d -Prune

다음은 bash, ksh93 및 zsh에서 도트 파일이 일치하는지 여부를 제어하는 ​​방법에 대한 자세한 내용입니다.

Bash

dotglob 옵션 을 설정하십시오.

$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero

보다 유연한 GLOBIGNORE variable 도 있습니다. 콜론으로 구분 된 와일드 카드 패턴 목록으로 설정하여 무시할 수 있습니다. 설정되지 않은 경우 (기본 설정) dotglob가 설정되어 있으면 값이 비어있는 것처럼 옵션이 설정되어 있지 않으면 값이 .* 인 것처럼 동작합니다. 설명서의 파일 이름 확장 을 참조하십시오. .가 패턴과 명시 적으로 일치하지 않는 한 퍼베이시브 디렉토리 ...는 항상 생략됩니다.

$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one

Ksh93

FIGNORE variable 을 설정하십시오. 설정이 해제되면 (기본 설정), 쉘은 값이 .* 인 것처럼 동작합니다. ...를 무시하려면 명시 적으로 일치해야합니다 (ksh 93s + 2008-01-31의 설명서에는 ...가 항상 무시 됨) 하지만 실제 동작을 올바르게 설명하지는 않습니다.).

$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero

도트 파일을 명시 적으로 일치시켜 pattern 에 도트 파일을 포함시킬 수 있습니다.

$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero

디렉토리가 비어있는 경우 확장을 비우려면 N 패턴 일치 옵션 ~(N)@(*|.[^.]*|..?*) 또는 ~(N:*|.[^.]*|..?*)을 사용하십시오.

Zsh

dot_glob 옵션 을 설정하십시오.

% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero

패턴이 선행 .와 명시 적으로 일치하더라도 ...는 일치하지 않습니다.

% echo .*
..two .one

Dglob 한정자 를 사용하여 특정 패턴으로 도트 파일을 포함 할 수 있습니다.

% echo *(D)
..two .one none zero

N glob 한정자를 추가하여 *(DN) 빈 디렉토리에 확장을 비 웁니다.


참고 : .one의 설정에 따라 파일 이름 확장 결과가 다른 순서 (예 : none, ..two, LC_COLLATE)로 나타날 수 있습니다. LC_ALLLANG 변수.

#!/bin/bash

shopt -s dotglob
mv Foo/* Bar/

man bash부터

dotglob 설정되면 bash는 '.'로 시작하는 파일 이름을 포함합니다. 경로 이름 확장 결과.

24
SiegeX

bash에서이를 수행하는 간단한 방법은

mv {Foo/*,Foo/.*} Bar/

그러나 이것은 또한 디렉토리를 이동시킵니다.

숨김을 포함하여 모든 파일을 이동하고 디렉토리를 이동하지 않으려면 for 루프 및 테스트를 사용할 수 있습니다.

for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;

11
Boris Month

한 가지 방법은 find를 사용하는 것입니다.

find Foo/ -type f -exec mv -t Bar/ {} \+

-type f는 find 명령이 파일 찾기로 제한합니다. 하위 디렉토리를 설명하도록 명령을 사용자 정의하려면 find-type, -maxdepth-mindepth 옵션을 조사해야합니다. 찾기에는 길지만 매우 유용한 수동 페이지 가 있습니다.

4
Steven D

복사 명령 cp을 (를) 시도하십시오.

$ cp -r myfolder/* destinationfolder

cp -r는 재귀 복사를 의미하므로 모든 폴더와 파일이 복사됩니다.

Remove 명령 rm을 사용하여 폴더를 제거 할 수 있습니다.

$ rm -r myfolder

더보기 : 디렉토리에서 다른 파일로 모든 파일 이동 .

2
ucefkh

minimal Linux 배포판의 경우 다음이 작동합니다. 먼저 기본 이동을 모두 수행하십시오 (숨겨진 파일이 누락 됨). 그런 다음 모든 숨겨진 파일을 이동하십시오 (... 포함 not 실제로 이동).

mv /sourceDir/* /destinationDir 2> /dev/null
mv /sourceDir/.* /destinationDir 2> /dev/null

Notes : 보이는 내용이 없으면 첫 번째 명령은 오류 메시지를 생성합니다. 두 번째 명령은 always...를 이동할 수 없다는 오류를 생성합니다. 따라서 오류를 /dev/null로 파이프하십시오 (그림 참조).

이것을 하나의 라이너로 필요하면 간단히 세미콜론과 결합하십시오.

mv /sourceDir/* /destinationDir 2> /dev/null; mv /sourceDir/.* /destinationDir 2> /dev/null
1
BuvinJ

Rsync는 또 다른 옵션입니다.

rsync -axvP --remove-source-files sourcedirectory/ targetdirectory

Rsync에서 후행 슬래시가 중요하기 때문에 sourcedirectory/는 디렉토리의 내용을 나타내며 sourcedirectory는 디렉토리 자체를 나타냅니다.

이 방법의 단점은 rsync가 이동 후 디렉토리가 아닌 파일 만 정리한다는 것입니다. 따라서 빈 소스 디렉토리 트리가 남아 있습니다. 이에 대한 해결 방법은 다음을 참조하십시오.

rsync로 파일을 이동하고 디렉토리를 삭제 하시겠습니까?

따라서 이것은 이동 작업에 최적이 아니지만 복사 작업에 매우 유용 할 수 있습니다.

1
Grumbel

bash/fish에 대한 답변

와일드 카드를 사용하여 수행하는 방법은 다음과 같습니다.

.[!.]* ..?*...를 제외하고 모든 숨겨진 파일과 일치합니다.

.[!.]* ..?* *...를 제외하고 숨겨 지거나 숨겨지지 않은 모든 파일과 일치합니다.

이 질문의 특정 예에 답하려면 cd foo && mv .[!.]* ..?* * ../bar가 필요합니다.

설명

.[!.]*는 하나의 점으로 시작하고 그 뒤에 점 을 제외한 모든 문자 와 문자열이 오는 파일 이름과 일치합니다. 이 정도면 충분하지만 ..foo와 같이 두 개의 점으로 시작하는 파일이 없습니다. 이러한 파일을 포함하려면 ..?*를 추가합니다. 두 개의 점으로 시작하고 그 뒤에 문자 , 선택적으로 , 문자열이 오는 파일 이름과 일치합니다. .

테스트

아래 명령을 사용하여 이러한 와일드 카드를 테스트 할 수 있습니다. 나는 bash와 fish에서 성공적으로 시도했습니다. 그들은 sh, zsh, xonsh에서 실패합니다.

mkdir temp
cd temp
touch  a  .b  .bc  ..c  ..cd  ...d  ...de
ls .[!.]* ..?*
# you get this output:
          .b  .bc  ..c  ..cd  ...d  ...de
# cleanup
cd ..
rm -rf temp
1
ndemou

나는 이것이 bash에 잘 작동하고 Shell 옵션을 변경할 필요가 없다는 것을 발견했다.

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/

이제 destdir 에있는 모든 파일이 표시됩니다.

 $ tree -a
.
├── destdir
│   ├── ..d1
│   ├── ..d2
│   ├── ..double
│   ├── file-1
│   ├── file-2
│   ├── .hidden-1
│   ├── .hidden-2
│   ├── ...t1
│   └── ...t2
└── sourcedir

4.x에서 더 많은 추가로 bash의 괄호로 멋진 일을 할 수 있습니다. 멋진 예제를 보려면 bash-hackers 를 확인하십시오.

0
cmndr sp0ck

이동 명령에 사용할 파일을 선택하기 위해 역 따옴표로 찾아서 grep 할 수도 있습니다. 그것들을 mv로 전달하십시오.

즉 숨겨진 파일

find Foo -maxdepth 1 | egrep '^Foo/[.]' # Output: .hidden

그래서

mv `find Foo -maxdepth 1 | egrep '^Foo/[.]'` Bar # mv Foo/.hidden Bar

선택한 숨김 파일 만 Bar으로 이동합니다.

mv `find Foo -maxdepth 1 | egrep '^Foo/.'` Bar # mv Foo/.hidden Foo/notHidden Bar

'.'이후 Foo의 모든 파일을 Bar로 이동합니다. egrep 명령에서 대괄호없이 와일드 카드 역할을합니다.

^ 문자는 줄의 처음부터 일치가 시작되도록합니다.

egrep 패턴 일치에 대한 자세한 내용은 here 를 참조하십시오.

maxdepth 1 찾기가 하위 디렉토리로 이동하는 것을 중지합니다.

0
user3192145

이 답변 에서 영감을 얻었습니다.

파일을 복사하지 않고 ...

rsync -ax --link-dest=../Foo/ Foo/ Bar

주의 사항 :

  • --link-dest 경로는 DESTINATION (예 : Bar)에 대해 절대적이거나 상대적이어야합니다.

  • SOURCE 뒤에 /를 두어야합니다 (예에서 Foo/). 그렇지 않으면 SOURCE 폴더의 내용 대신에 SOURCE 폴더가 복사됩니다.

0
palindrom