리눅스에서 현재 디렉토리의 모든 파일을 상위 디렉토리로 옮기는 방법은 무엇입니까?
과 같은 것을 시도했지만 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], 또는 이와 유사한 것을 제안 할 수 있습니까?