디렉터리가 아닌 모든 파일을 이동합니다.

디렉터리가 아닌 모든 파일을 이동합니다.

파일과 하위 디렉터리가 포함된 디렉터리를 정리하려고 합니다. 내가 원하는 것은 간단합니다. 모든 파일을 다른 디렉터리로 이동하되 모든 하위 디렉터리는 변경하지 않고 그대로 두는 것입니다.

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

mv [*_but_no_dirs] ./other_directory

*와일드카드와 정규식을 사용하여 이 작업을 수행 하는 쉬운 방법이 있어야 할 것 같습니다 ...

누구든지 어떤 아이디어가 있습니까?

답변1

여기에는 정규 표현식이 포함되지 않습니다. Bash의 와일드카드(대부분의 다른 쉘과 마찬가지로)는 유형이나 기타 특성이 아닌 이름만을 기준으로 파일을 일치시킵니다. 유형별로 일치시키는 방법이 있습니다. /디렉토리나 디렉토리만 일치하도록 패턴 끝에 심볼릭 링크를 추가하는 것입니다. 이 방법을 사용하면 디렉토리를 이동한 다음 나머지 디렉토리를 이동한 다음 다시 디렉토리를 이동할 수 있습니다. 번거롭지만 효과적입니다.

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

(현재 디렉토리가 파일 시스템의 마운트 지점인 경우에는 이 접근 방식을 피해야 합니다. 이는 디렉토리를 밖으로 이동하거나 뒤로 이동하면 그 안의 모든 데이터를 두 번 복사해야 함을 의미하기 때문입니다.)

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

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

(심볼릭 링크도 디렉토리를 가리키는지 여부에 관계없이 이동됩니다.)

zsh에서는 사용할 수 있습니다글로벌 예선유형별로 파일을 일치시킵니다. 한정자는 디렉터리가 아닌 모든 항목을 일치시키거나 디렉터리에 대한 기호 링크를 제외하는 데 .사용되는 일반 파일과 일치합니다 .^/-^/

mv -- *(.) other_directory/

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

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

(심볼릭 링크는 디렉토리로 이동되지 않습니다).

답변2

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

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

먼저 find현재 디렉터리만 살펴본 다음 ! -type d finally를 사용하여 디렉터리를 무시하고 sh모든 것을 실행하고 대상 디렉터리로 이동합니다. {} +마지막에 시도해 보면 더 빨라질 것입니다 .

답변3

조금 위험할 수도 있지만

cp * destination/
rm *

-r 스위치 없이는 cp나 rm을 디렉토리에서 실행할 수 없기 때문입니다.

답변4

mv $(find /my/source/directory -maxdepth 1 -type f) /my/destination/directory

findMove는 인수 목록을 사용하므로 피드에서 '파일' 유형의 모든 콘텐츠를 요청하면 /my/source/directory하나씩 이동합니다 /my/destination/directory. 디렉터리 구조를 변경하지 않고 하위 디렉터리에도 파일을 포함하려면 -maxdepth 1위 명령에서 해당 파일을 제거하세요.

관련 정보