하위 디렉토리의 모든 파일을 단일 디렉토리로 재귀 적으로 이동하려면 어떻게해야합니까?


10

현재 디렉토리 아래의 모든 파일과 모든 하위 디렉토리를 하나의 디렉토리에 수집하려고합니다. 나는 다음과 같은 것을 시도하고있다.

find -type f -exec mv {} collection/{} \; 

두 번째 {}가 전체 경로를 제공 하기 때문에 위의 명령이 작동하지 않습니다. 모든 파일을 어떻게 수집 할 수 있습니까?

답변:


14

제거] {}에서 mv, mv어떤 부모 디렉토리를 무시하고 대상 디렉토리로 걸릴 것입니다 :

find -type f -exec mv {} collection/ \;

오, 그건 나에게 일어나지 않았다. 고마워요 :)
토끼 토끼

내가 질문에 대한 대답에서 말했듯이 이것은 잠재적으로 나쁜 생각입니다. 아마도 인수를 사용하면 -maxdepth 1도움이 될 것입니다.
loevborg

그것을 생각해 보니, 나는 당신의 질문을 잘못 읽은 것 같습니다 :) 죄송합니다.
loevborg

@loevborg : 제목에 "재귀 적으로"추가했습니다. 여전히 혼동이있는 경우 편집하여 개선하십시오. :)
Lekensteyn

1
이 답변의 더 빠른 변형은find -type f -print0|xargs -0r mv -it colection/
hildred

5

find(작업을 잘 수행하는) 사용하는 대신 ,이 목적으로 쉘을 사용할 수도 있습니다.

$ PWD에서 $ DEST까지 모든 파일을 원한다고 가정하십시오. 자연스러운 시도는 다음과 같습니다.

mv $PWD/* $DEST

어떻게 작동합니까? "$ PWD / *"표현식은 해당 디렉토리의 모든 파일 이름으로 확장됩니다. 이 쉘 기능을 "globbing"이라고합니다. 마지막 인수 mv는 대상 디렉토리입니다. 파일이 너무 많으면 명령 줄의 길이가 제한되어있어 작동하지 않습니다.

그러나 해결책은 점 파일 또는 "숨겨진"파일, 파일 이름 및 "."로 시작하는 디렉토리를 생략한다는 문제가 있습니다. 이 문제를 해결하려면 글 로빙 할 때 셸에 도트 파일을 포함시켜야합니다. 이렇게하려면

shopt -s dotglob

사용할 때 bash(그리고 bash기본값을 변경하지 않은 경우 아마 사용 합니다). 이 셸에서 위의 명령은 도트 파일에서도 작동합니다.

이외에도에서 zsh사례별로 선택할 수있는 옵션이 있습니다. 이렇게하려면 넣어

setopt extendedglob

당신의 .zshrc. 그런 다음 사용할 수 있습니다

mv $PWD/*(D) $DEST

도트 파일을 포함한 모든 파일을 이동합니다. "D"는 "GLOB_DOTS"옵션을 일시적으로 활성화하는 효과가 있습니다.

이제 원래 질문은 모든 하위 디렉토리와 하위 디렉토리에서 모든 일반 파일 (디렉토리가 아님)을 단일 디렉토리로 이동하는 것이 었습니다. 이 작업은 zsh다음 과 같이 수행 할 수 있습니다 .

mv $PWD/**/*(D.)

여기서 표현식 **/*은 글로버를 재귀 적으로 하위 디렉토리로 내립니다. D"또한 dotfiles '를 선택, 수단 .수단"은 일반 파일이 아닌 디렉토리 "를 선택합니다.


글쎄, 나는 또한 모든 하위 디렉토리로 재귀를 원했지만 정보가 도움이되는 방식으로 감사합니다.이 상황을 너무 많이
토끼 토끼

실제로, 찾기는 이것으로 과도하지 않으며, 글 로빙은 파일뿐만 아니라 디렉토리까지 모든 일치 항목을 선택합니다. 성능이 걱정된다면 다음과 같이 사용할 수도 있습니다 find -type f -exec mv -t collection/ {} +.. 작동 방식에 대해서는 매뉴얼 페이지를 참조하십시오.
Lekensteyn

레켄 스테인, 네 말이 맞아 질문을 이해 했으므로 답변을 업데이트했습니다.
loevborg

2
질문에 특히 관련이없는 훌륭한 답변 :).
crazy2be
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.