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


14

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

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

다음 이동하려고합니다 때문에 분명히 작동하지 않습니다 new_directorynew_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.