리눅스에서 현재 디렉토리의 모든 파일을 상위 디렉토리로 옮기는 방법은 무엇입니까?
과 같은 것을 시도했지만 mv *.*
작동하지 않습니다.
리눅스에서 현재 디렉토리의 모든 파일을 상위 디렉토리로 옮기는 방법은 무엇입니까?
과 같은 것을 시도했지만 mv *.*
작동하지 않습니다.
답변:
당신이 찾고있는 명령은
mv * .[^.]* ..
또는 (자세한 내용은 아래 참조) :
(shopt -s dotglob; mv -- * ..)
설명 : mv
명령이 파일 및 디렉토리를 이동합니다. 에 대한 마지막 인수 mv
는 대상입니다 (이 경우 디렉토리에서 디렉토리의 한 단계 "업" ..
). 그 이전의 인수는 소스 파일과 디렉토리입니다. 별표 ( *
)는 점으로 시작하지 않는 모든 파일과 일치하는 와일드 카드입니다. 점 (점 파일)으로 시작하는 파일은 "숨겨집니다". 패턴을 사용하여 일치시킵니다 .[^.]*
(아래 편집 참조).
에 대한 자세한 내용은 내가 연결 한 맨 페이지를 참조하십시오 mv
.
.[^.]*
대신에 .*
?로 크리스 욘센이 정확하게 지적 : 패턴 .*
도 일치 .
하고 ..
. 그것들을 옮기고 싶지 않으며 움직일 수 없기 때문에 두 개를 제외한 점으로 시작하는 파일 이름과 일치하는 패턴을 사용하는 것이 좋습니다 . 패턴 .[^.]*
은 다음을 수행합니다. 점 (2)으로 시작하고 그 뒤에 점 (3) 이 아닌 문자 뒤에 0 개 이상의 임의의 문자가 오는 파일 이름 (1)과 일치합니다 .
으로 Paggas는 지적 , 우리는 또한 패턴을 추가해야 할 것 .??*
두 개의 점으로 시작하는 파일과 일치하기 위해. 를 사용하는 대체 솔루션에 대한 그의 답변을 참조하십시오 find
.
Arjan의 대답shopt
은 도트 파일과 관련된 모든 문제를 피하기 위해 언급 했습니다. 그러나 대시로 시작하는 파일에는 여전히 문제가 있습니다. 그리고 세 가지 명령이 필요합니다. 아직도, 나는 그 아이디어를 좋아한다. 나는 이것을 다음과 같이 사용할 것을 제안한다.
(shopt -s dotglob; mv -- * ..)
이것은 shopt
서브 쉘에서 실행 되므로 (두 번째 호출이 shopt
필요 --
하지 않음) 대시로 시작하는 파일이에 대한 인수로 해석되지 않도록 사용합니다 mv
.
.*
발생할 수 있습니다 MV를 이동 할 수 없다는 대해 경고 / 오류를 생산 .
하고 ..
. mv * .[^.]* ..
대신 시도해보십시오 .
짧은 대답 : 사용
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
긴 대답 :
명령
mv * .* ..
이후 작동하지 않습니다 .*
일치시킬 수 있습니다 .
와 ..
. 그러나 명령
mv * .[^.]* ..
.[^.]*
예를 들어, 일치하지 않기 때문에 작동 하지 않습니다 ..filename
! 대신 내가하는 일은
mv * .[^.] .??* ..
이는 제외한 모든 일치 .
하고 ..
. *
로 시작하지 않는 모든 것을 일치 .
, .[^.]
제외 점으로 시작하는 모든이 문자 파일 이름을 일치 ..
하고, .??*
최소 3 자에 점으로 시작하는 모든 파일 이름과 일치합니다.
더 나은 아직, 당신은 사용할 수 있습니다
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
추악한 글로브 해킹을 피할 수 있습니다 mv * .[^.] .??* ..
!
..?*
댓글로 돌아 가기 위해 돌아 왔는데 이미 처리 했었습니다.
mv
추가 명령 옵션을 찾지 않도록 지시 합니다. 중괄호는 결과 파일 이름입니다. 더하기 부호는 결과 당 (예 : 파일 이름 당) exec를 실행하는 대신 가능한 한 단일 exec에 많은 결과를 넣습니다. 완전성을 -t..
위해 대상 대상을 이동하여 이러한 모든 파일을 이동시키는 것입니다.
완전성을 위해 Bash 쉘에 다음을 사용하여 숨겨진 파일을 포함하도록 지시 할 수도 있습니다 shopt
.
shopt -s dotglob
mv -- * ..
shopt -u dotglob
rsync -a --remove-source-files . ..
rsync
매우 효율적인 파일 복사 도구로, 일반적으로 효율적인 증분 원격 백업 및 미러를 수행하는 데 사용됩니다.
위의 명령으로 rsync
내용 .
을..
이 스위치 -a
는 .
하위 디렉토리 로의 재귀를 활성화하고 다른 공통 옵션을 활성화합니다.
스위치 --remove-source-files
는 복사 성공 후 소스 파일을 제거하도록 rsync에 지시합니다. 즉, rsync가 mv
명령 과 유사하게 작동합니다 .
--remove-source-files
(동기화) 디렉토리를 제거하지 않습니다.
-bash: /bin/mv: Argument list too long
오류를 준다 . 이것은 매력처럼 작동합니다.
mv .
mv는 현재있는 디렉토리를 링크 해제 할 수 없기 때문에 궁극적으로 시도 가 실패 mv * ..
합니다. cwd에서 파일을 이동할 수 있습니다.
mv * .??* ../.
*
모든 비 도트 파일을 가져옵니다. .??*
모든 것을 얻는다. 최소 3 바이트 길이의 파일로 모든 합법적 인 파일에 적용됩니다. 어쨌든 당신이 원하는 것은 아마도 rm
남았을 것 mv
입니다.
이 프로그램 ../.
은 직접적인 이점을 제공하지는 않지만 ..
디렉토리로 이동하면 경로에 문제가있는 경우 원하는대로 실패하기 때문에 들어가는 것이 좋습니다. 예를 들어 mv xyz bletch
, 어디 생각 bletch
디렉토리입니다, 더 특정 할 수있다 mv xyz bletch/.
.
.[^.]
와 같은 표지 파일을 얻기 위해 추가 할 수 있습니다 .a
.
이 최소화 된 명령은 대부분의 최신 쉘에서 작동합니다.
\mv -- {,.{[^.],??}}* ..
그렇지 않으면 휴대용 솔루션이 언급됩니다.
\mv -- * .[^.] .??* ..
풍모:
\는 별칭이 mv를 바람직하지 않게 변경하지 못하게합니다.
-하이픈 (-xyz)을 포함하는 파일 이름이 명령 줄 인수로 해석되지 않도록합니다.
. [^.]는로 시작하는 두 문자 파일 이름과 모두 일치합니다. .. 제외
. ?? *는 다른 모든 파일 이름을 3 자 이상 일치시킵니다.
순진한 구현 :
다음은로 시작하는 숨겨진 UNIX 파일 이름을 건너 뜁니다. (.bashrc).
mv * ..
다음은 .. 일치하여 모든 디렉토리를 재귀 적으로 현재 작업 디렉토리 ($ PWD 또는 pwd)의 /. 절대 사용하지 마십시오.
mv .* ..
이 패턴을 사용하는 것이 더 맞습니다 * .[!.] .??*
보다 * .[^.] .??*
전자는 또한 ksh88과 같은 오래된 조개와 함께 작동하기 때문에 :
mv -- * .[!.] .??* ..
--
다음으로 시작하는 파일 이름이있을 때 문제를 방지합니다 -
*
로 시작하지 않는 모든 파일 이름과 일치 .
.
이동할 수 있거나 움직여야 하는 문자 파일 이름이 없습니다..[!.]
로 시작하는 두 문자 파일 이름과 모두 일치 .
.??*
로 시작하는 세 문자 파일 이름 (또는 그 이상)과 모두 일치 .
ksh88을 사용하면 파일 이름 패턴 .[^.]
은 실제로는 ..
항상 존재 하는 파일 이름 과 .^
존재하지 않는 파일 이름과 일치하여 원하는 것과 반대의 영향을 미칩니다.
작업을 찾아서 grep하십시오. find 및 egrep을 수정하여보다 복잡한 기준으로 파일을 선택하려는 경우 이러한 종류의 구조가 도움이 될 수 있습니다.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
모든 파일을 부모 디렉토리로 옮기는 가장 쉬운 해결책이라고 생각합니다. 될 것이다
mv "`ls`" ../
또는 숨겨진 파일 / 디렉토리가있는 경우
사용하다:
mv "`ls -a`" ../ 2>/dev/null
또한 일부 폴더의 내용을 내부 폴더 중 하나로 옮기고 싶다고 말하십시오.
사용하다:
mv "`ls -a`" /tony 2>/dev/null
노트 :
"`ls -a`"
공백이있는 파일을 이동합니다.
2>/dev/null
및 폴더를 ls -a
인쇄하고 이동하거나 복사 할 수 없으므로 경고 / 오류를 억제하기위한 것입니다. 따라서 해당 폴더의 경우 2> / dev / null을 사용하지 않으면 폴더를 이동할 수 없으며 나머지는 매우 편안하게 이동한다는 오류가 표시됩니다..
..
ls -a
숨겨진 파일이없는 경우 피하고 사용하십시오 ls
.
mv $(ls -a)
? 현재 디렉토리와 그 아래 디렉토리를 두드리면 ls -a
출력 ..
됩니다.
mv ls -a ../
필요에 따라 작동했을 것입니다. 그렇습니다. 필자는 위에서 언급 한 오류를 표시하지만 필요한 폴더 / 파일을 상위 디렉토리로 이동합니다.
ls
공백으로 파일을 이동 하려면 명령 을 큰 따옴표 로 묶어야합니다. 필요한 사항을 변경했습니다. 지적 해 주셔서 감사합니다.
[linux] [mv] [cwd] [files]
, 또는 이와 유사한 것을 제안 할 수 있습니까?