에 파일이 있습니다 /home/jjblack/foo/
. 해당 디렉토리의 모든 내용을 으로 이동하고 싶습니다 /home/jjblack/foo/bar/
.
디스크 공간이 부족해서 다른 곳에 내용을 복사할 수 없습니다. 저 할 수 있어요
mv /home/jjblack/foo /home/jjblack/xyz
mkdir /home/jjblack/foo
mv /home/jjblack/xyz /home/jjjblack/foo/bar
하지만 이보다 더 우아한 한 줄 솔루션이 있을까요?
답변1
여기에 단축된 경로 이름이 포함된 명령 시퀀스는 jjblack
현재 사용자를 가정합니다( ~jjblack
대신 다른 것을 사용하십시오 ~
).
mv ~/foo ~/xyz
mkdir ~/foo
mv ~/xyz ~/foo/bar
나는 이것이 매우 우아하다고 생각합니다. 누락된 유일한 것은 이전 명령이 실패할 경우 다음 명령이 실행되지 않도록 보장하는 몇 가지 안전 검사입니다.
[ ! -e ~/xyz ] &&
mv ~/foo ~/xyz &&
mkdir ~/foo &&
mv ~/xyz ~/foo/bar
또는 한 줄에 입력해야 하는 경우:
[ ! -e ~/xyz ] && mv ~/foo ~/xyz && mkdir ~/foo && mv ~/xyz ~/foo/bar
이제 이것은 "간단한 명령"의 "AND 목록"으로 구성된 단일 "완전한 명령"(셸 구문 의미)입니다.
이렇게 하면 숨겨진 이름과 관련된 문제가 방지되고, 잠재적으로 수백만 개의 이름 목록이 생성되는 와일드카드 패턴이 확장되지 않으며, 개별 파일을 이동하려고 시도하지 않으며(개별 디렉터리를 이동하는 것보다 느림), 대규모 추가 파일을 사용하지 않습니다. 파일 저장 공간. 또한 원래 디렉터리의 메타데이터(소유권 및 권한 등)가 foo
새 이름으로 성공적으로 이동되었습니다 bar
.
동일한 작업을 수행하는 또 다른 방법은 먼저 새 상위 디렉터리를 만들고 마지막으로 이름을 바꾸는 것입니다. 이를 통해 -e
이름이 이미 존재하는 경우 mkdir
실패하게 되는 테스트를 제거할 수 있습니다 .~/xyz
mkdir ~/xyz &&
mv ~/foo ~/xyz/bar &&
mv ~/xyz ~/foo
답변2
cd /home/jjblack/foo
mkdir bar && mv * bar/