디렉토리가 아닌 모든 파일을 이동


14

파일과 하위 디렉토리를 모두 포함하여 정리하려는 디렉토리가 있습니다. 내가하려고하는 것은 간단합니다. 모든 파일을 다른 디렉토리로 옮기고 모든 하위 디렉토리는 그대로 두십시오.

나는 다음과 같은 것을 생각하고있다 :

mv [*_but_no_dirs] ./other_directory

와일드 카드 *와 정규식 으로이 작업을 수행하는 간단한 방법이 있어야합니다 .

누구나 아이디어가 있습니까?


1
하위 폴더의 모든 파일을 이동하지만 하위 디렉토리의 파일을 무시 하시겠습니까?
Wilf

@Wilf : 맞습니다.
Questionmark

2
zsh에서는 mv **/*(.) ./other_directorybash를 사용하여과 같은 외부 명령을 사용해야합니다 find.
godlygeek

답변:


12

정규식은 여기에 관여하지 않습니다. bash의 와일드 카드 (대부분의 다른 쉘과 마찬가지로)는 파일 유형이나 기타 특성이 아닌 파일 이름을 기준으로 파일 만 일치합니다. 유형별로 일치하는 한 가지 방법이 있습니다 /. 패턴 끝에 추가 하면 디렉토리 또는 디렉토리에 대한 기호 링크 만 일치합니다. 이 방법으로 디렉토리를 이동 한 다음 남은 것을 이동하고 디렉토리를 다시 이동할 수 있습니다. 번거롭지 만 작동합니다.

tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"

유형별로 파일을 일치시키는 표준 방법은을 호출하는 것 find입니다.

find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +

zsh에서는 glob 한정자 를 사용 하여 유형별로 파일을 일치 시킬 수 있습니다 . .규정은 일반 파일과 일치; 사용 ^/, 또는 이외의 모든 디렉토리에 맞게 -^/또한 디렉토리에 심볼릭 링크를 포함합니다.

mv -- *(.) other_directory/

모든 쉘에서 간단하게 반복 할 수 있습니다.

for x in *; do
   if ! [ -d "$x" ]; then
     mv -- "$x" other_directory/
   fi
done

8

당신은 같은 것을 사용할 수 있습니다

find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv  "$@" MYDIR' _ {} \;

먼저 우리 find는 현재 directoy 내에서만 살펴본 다음 ! -type d 마지막으로 실행 sh하여 모든 것을 대상 디렉토리로 이동 하여 디렉토리를 무시 합니다. 당신은 {} +더 빠른 끝에 결국 시도 할 수 있습니다.


2
약간의 설명을 부탁합니다.
Questionmark

1
@Questionmark 답변을 업데이트하고 설명을 추가했습니다. 또한 mywiki.wooledge.org/UsingFind
Valentin Bajrami를

-exec sh -c 'mv "$@" MYDIR' _ {} \;오히려 제안 하지 -exec mv {} MYDIR \;않습니까? 그냥을 변경하여 간소화 할 수있는 무언가 얻을 \;A를을 +? -exec mv -t MYDIR {} +양식으로 그렇게 할 수 있습니다 .
Scott

@Scott 나는 -t깃발 에 대해 전혀 몰랐다 . 또한 대답에서 +더 빠르지 만 모든 find버전이 지원 하지는 않는다고 대답 했습니다. 따라서 위의 코드 find는 사용되는 쉘 또는 쉘 과 거의 호환 됩니다.
Valentin Bajrami

1
@ val0x00ff : "… 위의 코드 find는 사용 된 쉘이나 쉘 과 거의 호환 됩니다." 맞습니다. 그러나이며 find … -exec mv {} MYDIR \;,보다 적은 리소스를 사용합니다 … -exec sh -c 'mv "$@" MYDIR' _ {} \;.
Scott

0

잠재적으로 조금 위험하지만

cp * destination/
rm *

cp와 rm은 모두 -r 스위치가없는 디렉토리에서는 작동하지 않습니다.


-1

나는 mv *.* destination/목적지로 이동 하는 것이 좋습니다 .



2
디렉토리 이름은 '점'을 포함 할 수 있으며 파일 이름은이를 제외 할 수 있으며 종종 *.*디렉토리를 이동하고 일부 파일을 남겨 두 므로 이는 요청자가 원하는 것이 아닙니다.
dave_thompson_085

미안하지만 이것은 완전히 잘못되었습니다. 단순히 이름에 점이있는 것을 움직이고 하나가없는 것은 움직이지 않습니다. 점은 파일에만 국한되지 않으며 파일에도 필요하지 않으므로 파일과 디렉토리의 무작위 선택 만 이동합니다.
terdon

-2
mv $(ls -l | grep "^-" | awk '{print $9}') ./folder_where_move
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.