디렉토리의 모든 파일을 해당 디렉토리로 이동하는 배쉬 스 니펫


14

파일과 디렉토리가 많은 디렉토리가 있습니다. 정리하기 위해 모든 파일을 디렉토리에 넣을 것이므로 다음과 같이 할 것입니다.

$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory

다음 이동하려고합니다 때문에 분명히 작동하지 않습니다 new_directory에 new_directory. 해당 디렉토리의 모든 파일과 디렉토리를 복사하여 붙여 넣을 필요없이 한 줄로 원하는 것을 수행하는 간단한 방법이 있습니까?


3
작동하면 new_directory를 자체로 이동할 수 없다는 오류 메시지를 인쇄합니다.
— cas

답변:


18

너의

mv * ./new_directory
명령은 실제로 작동합니다. 해당 디렉토리를 그 자체로 이동할 수 없다는 경고를 인쇄합니다.


이것의 유일한 문제는 명령의 전체 확장이 너무 길어지면 (즉, 너무 많은 파일, 너무 긴 이름) 더 이상 작동하지 않는다는 것입니다.
— Niels Basjes

참고로, 이것을 git mv사용하려면 -k플래그 를 사용해야합니다 .git는 경고를 내뱉는 것이 아니라 기본적으로 실패하기 때문입니다. 따라서해야합니다 git mv -k * ./new_dir.
— Yuval A

11

빠르고 더러운 oneliner.

mv `ls -A | grep -v new_directory` ./new_directory

1
작동하지 않습니다 : 일반 ls는 도트 파일을 표시하지 않습니다.
— wzzrd

아주 좋은 지적입니다. -a로 수정했습니다.

2
따라서 mv new_directory를 자체로 시도하는 대신 (원래 질문) 이제 이동하려고합니다. 그리고 ..를 new_directory에 넣습니다.
— Niels Basjes

2
피드백 Niels에 감사드립니다. 를 제거하는 상단 a로 고정했습니다. 디렉토리 목록에서 ..

8

디렉토리 만 아닌 파일 만 찾고 있다면

find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;

가장 휴대용 솔루션입니다. 속도를 높이려면 find와 xargs를 -print0과 -0과 함께 이동해야하지만 GNU find와 xargs가있는 경우에만 가능합니다.


3
최신 GNU find를 사용하면 \ 대신 \ +를 사용할 수도 있습니다. 우리가 만들고있는 mv의 수를 줄입니다.
— wzzrd

GNU find를 가지고 있다면, xargs를 사용해야합니다. xargs도 마찬가지입니다. -p 플래그를 사용하여 여러 mvs를 동시에 실행할 수 있습니다.
— 시안

멋진 사용 find-나는 분명히 하나도없는 시스템에 있었지만 슬프게도 :(
— warren

정말? SUS에 지정된 (afaik)이므로 모든 것이 있어야합니다. 유일한 문제는 GNU 찾기 (멋진 옵션이 많이 있음) 또는 정기적 찾기입니다.
— Cian


6

이 문제가 발생한 시간은 다음 중 하나를 수행했습니다.

$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .

또는

$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory

두 번째 형식은 '.'로 시작하는 와일드 카드 생략 파일 이름을 활용합니다.


와일드 카드 건너 뛴 점선 파일을 잊었습니다. 알림 주셔서 감사합니다! :)
— aemonge

2

는 어때:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

IOW, 내용을 새 디렉토리로 옮기지 말고이 디렉토리를 새 디렉토리에 넣으십시오.


1

@ Rembrane 의 답변 과 비슷한 방식으로 (하나의 라이너는 아니지만) :

for FN in *
do
    if [ "<new_dir>" != $FN ] then
        mv $FN <new_dir>
done

find슬프게도 시스템에없는 경우에도 100 % 휴대 가능 해야합니다.


단일 유닉스 사양에서 찾기가 필요합니다. 따라서, 그것은 절대로 없어서는 안됩니다 (당신이 그것으로 무언가를 만들 수는 없었습니다. 그러나 그것은 엄청난 노력이 필요하고 어떤 벤더 시스템도 그것을 필요로하지 않을 것이라고 상상할 것입니다)
— Cian

어쩌면 그것은 하이퍼 편집증 sysadmin yoinking findutils 또는 동등한 것입니까? 확실하지 않지만, 나는 그것을 가지고 있지 않은 boxen에 부딪쳤다는 것을 안다 :(
— warren

1

내 제안 : 다른 사람들이 언급했듯이

mv * ./new_directory

IFF는 전체 확장이 충분히 짧다는 것을 알게됩니다.

다른 방법으로는 훨씬 더 많은 수의 파일로 확장되는이 방법을 시도 할 수 있습니다.

find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory

설명

  1. 모든 파일을 나열하십시오.
  2. 모든 파일 이름을 최대 100000 자 청크로 묶습니다.
  3. 청크 당 단일 mv 명령을 구성하십시오.

파일 이름에 공백이 있으면 중단
— Cian

네가 옳아. 그래서 이것을 수정하기 위해 -print0 및 -0 플래그로 보강해야한다고 생각합니다.
— Niels Basjes

나는 함께 해봤 -print0그리고 -0그것은 여전히 휴식.
— Cristian Ciupitu

찾기 : 경고 : 옵션이 아닌 인수 -type 뒤에 -maxdepth 옵션을 지정했지만 옵션이 위치가 아닙니다 (-maxdepth는 그 전에 지정된 테스트와 그 뒤에 지정된 테스트에 영향을 미침). 다른 인수보다 먼저 옵션을 지정하십시오.
— Cristian Ciupitu

1

사용하다:

find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \
    xargs -0 -P 100 -I'{}' mv '{}' new_directory

로부터 xargs매뉴얼 페이지

-P max-procs

  Run up to max-procs processes at a time;

-1

오류 메시지를 피하고 간단하게 유지하십시오.

mv *.* ./new_Folder

동일한 작업을 수행하지만 오류 메시지를 피하십시오 (폴더 이름에 점이 없으면).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.