에 디렉터리가 있습니다 /var/www/html
. mv
from을 사용하여 이 디렉터리의 이름을 바꿨습니다.실시예 1도착하다실시예 2.
이름을 변경한 후 새로 명명된 디렉터리에 어떻게 들어가나요?
이 목표를 어떻게 달성할 것인가? 그것은 사용할 수 있습니까 find
?mmin
0*60
내 목표는 두 가지 다른 작업이 아닌 하나의 작업으로 이름을 바꾸고 입력하는 것입니다.
이상적으로는 시스템에서 어떤 것도 사용자 정의할 필요가 없는 한 줄 솔루션을 목표로 하고 있습니다.
답변1
이를 .bashrc 또는 .bash_aliases 파일(또는 쉘이 아닌 경우 이에 상응하는 파일 bash
)에 추가할 수 있습니다.
mvcd () {
mv -- "$1" "$2" &&
cd -P -- "$2"
}
그런 다음 셸을 다시 시작하면 다음과 같은 기능을 사용할 수 있습니다.
mvcd foo bar
$2
기존 디렉토리가 아니라고 가정합니다 . 그렇지 않으면 mv
이동됩니다. $1
입력하다그것은 관련이 있다도착하다( 이를 방지하려면 -T
GNU 옵션을 참조하세요 mv
).
--
옵션의 끝을 표시합니다. mv "$1" "$2"
할 것이다 mv "$option_or_source" "$option_or_argument_to_first_option_or_destination"
. 이름이 로 시작하더라도 mv -- "$1" "$2"
보장 $1
되고 옵션으로 처리되지 않으므로 항상 로 처리됩니다 . 일반적으로 명령에 임의 인수가 제공되는 경우 이를 사용 하려고 합니다 .$2
-
mv -- "$source" "$destination"
--
-P
(을 위한물리적cd
..
디렉터리 탐색) 은 POSIX 셸에 내장된 경로 구성 요소의 특수 처리 $2
기본값 을 방지하여 mv
. 이것이 없으면 다른 디렉토리로 CD를 넣고 이름을 바꿀 수 cdmv foo ../bar
있습니다 .cd
bar
mv
foo
이를 설정한 경우 (또는 셸이 시작될 때 환경에 있는 경우) 해당 호출에 대해서도 비활성화 $CDPATH
해야 합니다 .cd
mvcd () {
mv -- "$1" "$2" &&
CDPATH= cd -P -- "$2"
}
몇 가지 추가 코너 케이스 문제가 여전히 존재합니다. ( -
일부 쉘에서는 -2
) +3
그 이후에도 특별 대우를 받습니다 --
. foo
로 이름을 바꾸려면 대신 -
을 사용하십시오 .mvcd foo ./-
mvcd foo -
답변2
에서 :ksh93
bash
$ pwd
/tmp
$ mkdir test_dir
$ mv test_dir another_name
$ cd $_
$ pwd
/tmp/another_name
$_
이전 명령의 마지막 인수로 확장됩니다.
쉘 함수로서:
mvcd () {
mv -- "$1" "$2"
cd -P -- "$_"
}
하지만 당신은 또한 사용할 수 있습니다
mvcd () {
mv -- "$1" "$2" &&
cd -P -- "$2"
}
이는 실패할 경우 디렉토리를 변경하려는 시도를 방지하기 때문입니다 mv
.
대시로 시작하는 이름을 허용하려면 이중 대시가 필요합니다. 이러한 경우 이중 대시는 명령줄 옵션의 끝을 나타내며 이름이 옵션으로 해석되는 것을 방지합니다.
with 는 수행된 것과 동일한 방식으로 경로를 해석하는 데 필요합니다 ("논리적으로 -P
"가 아니라 "물리적으로") . cd
이렇게 하면 기호 링크를 포함하고 통과하는 경로를 사용하여 새 위치를 지정할 때 혼란이 방지됩니다.cd
mv
..
단순히 디렉터리 이름을 바꾸는 것이 아니라 이동하는 경우 이동에 디렉터리 이름 바꾸기가 포함되지 않는 상황을 해결해야 합니다.
mv some_dir existing_dir
이게 들어가 some_dir
니까 existing_dir
사람들이 해야지
cd existing_dir/some_dir
그런 다음 작업 디렉터리를 이동된 디렉터리로 변경합니다.
다음 수정된 셸 함수는 이 문제를 해결할 수 있습니다.
mvcd () {
if [ -d "$2" ]; then
mv -- "$1" "$2" &&
cd -P -- "$2/$1"
else
mv -- "$1" "$2" &&
cd -P -- "$2"
fi
}
또는 "더 짧게":
mvcd () {
if [ -d "$2" ] && mv -- "$1" "$2"; then
cd -P -- "$2/$1"
elif mv -- "$1" "$2"; then
cd -P -- "$2"
fi
}
mv
을 결합하여 cd
진정한 원자적 작업으로 만들 수 있는 방법은 없습니다 . 그런 다음에는 어떻게 보든, C로 작성하더라도 mv
먼저 발생 해야 합니다 . cd
(종료 상태를 확인하면서) 차례로 실행하는 것이 mv
올바른 접근 방식입니다.
답변3
파일 이름(디렉터리 유형 등)을 바꾸면 파일이 수정되지 않으므로 마지막 수정 시간도 변경되지 않습니다. 그것은상태 변경시간( -cmin
지나지 않은 대신 확인됨 -mmin
)이 업데이트되었습니다(적어도 Linux에서는 그러나 POSIX는 이에 대해 어떠한 보장도 제공하지 않습니다).
수정되는 것은 파일을 이동한 디렉토리(항목이 제거되거나 이름이 변경된 경우)와 디렉토리로(항목이 추가되거나 이름이 변경된 경우)입니다. 상태 변경 시간도 수정됩니다.
따라서 최근에 이름이 바뀐 디렉터리를 경험적으로 찾으려는 경우 한 가지 방법은 최신 ctime이 있는 파일을 찾는 것입니다. 여기서 ctime은 mtime과 다릅니다.
zsh 사용:
ctime_is_mtime() {
zmodload zsh/stat
local -A stat
zstat -H stat -- $REPLY &&
((stat[ctime] == stat[mtime]))
}
cd ./**/*(D/oc^+ctime_is_mtime[1])
glob 한정자 설명:
D
숨겨진 파일과 디렉터리를 건너뛰지 마세요/
디렉터리 유형의 파일만 고려됩니다.oc
시간순으로 정렬^
아니요+ctime_is_mtime
ctime과 mtime을 확인하려면 이 함수를 호출하세요.
1초 미만의 세분성을 지원하는 파일 시스템에서도 시간 세분성은 초 단위까지만 내려갈 수 있습니다.
ctime
수정하되 mtime
액세스 이외의 메타데이터가 수정되는 경우 atime
(예: chmod
, chown
... setfacl
)와 touch
임의 수정 시간 설정을 사용하는 경우 가 다르거 ctime
나 달라질 수 있는 경우는 포함하지 않습니다.mtime
1 기술적으로 한 디렉터리에 대해 다른 디렉터리로 이동할 때 물리적 ..
"."(이제 새 상위 디렉터리를 가리킴)을 계속 저장하는 파일 시스템에 대한 항목을 변경합니다. 및 ".." 항목을 OS 수준에서 위조하는 대신 디렉터리에 추가합니다. 그러나 AFAICT, 이 경우 시스템은 여전히 mtime을 변경하지 않습니다.
답변4
에 전화하기 전에 디렉토리를 변경할 수 있습니다 mv
. 이로 인해 쉘은 현재 작업 디렉토리에 대해 혼란스러워집니다. 소스와 대상이 동일한 파일 시스템에 있는 한 이는 애플리케이션에 무해하지만 변수 PWD
, pwd
내장 명령 및 이전 위치를 표시하는 프롬프트 등이 남습니다. 친구를 업데이트하려면 pwd
zsh 및 bash에서 ;를 사용할 수 있지만 cd .
다른 쉘에서는 수행해야 할 작업이 없습니다 cd `pwd -P`
. 두 경우 모두 심볼릭 링크 정보에 대한 내용이 보존되지 않습니다.
cd /some/where
mv "$PWD" /else/where
cd . # works in bash and zsh; use cd "`pwd`" in other shells
$PWD
셸 특수 문자가 포함되어 있지 않으면 따옴표를 생략할 수 있습니다. 자체적으로 이동할 수 없기 때문에 .
소스 로 사용할 수 없습니다 . 이동하려면 "실제" 디렉터리 항목이 필요합니다.mv
.
이 솔루션의 장점은 경로를 여러 번 입력할 필요가 없으며 mv
두 번째 인수가 기존 디렉터리인지 여부에 관계없이 두 가지 작동 모드 모두에 강력하다는 것입니다.
이 접근 방식의 주요 이점은 입력이 거의 필요하지 않고 함수에서 많은 이점을 얻지 못한다는 점이지만 이를 함수에 채울 수 있습니다. 기능을 사용하기로 결정했다면 다음 방법 중 하나를 사용하는 것이 좋습니다.
반대로 작업을 수행하면 한 줄 솔루션은 많은 상황을 희생해야 합니다. 의 마지막 매개변수는 mv
기존 디렉터리일 수 있으며, 이 경우 소스는 이 디렉터리로 이동되고 기본 이름을 유지하거나 유지하지 않습니다. 이 경우 최종 이름은 대상이 됩니다. 다음은 단순함을 유지하면서 두 경우를 모두 처리하는 함수입니다(즉, 많은 극단적인 경우를 놓친다는 의미입니다).
mvcd () {
mv "$@" &&
if [ $# -eq 2 ] && [ ! -d "$2" ]; then
cd "$2"
else
shift $(($#-2))
cd "$2/${1##*/}"
fi
}
나는 변수를 moved
대상 파일 목록으로 설정하는 더 크고 강력한 기능을 사용합니다. 여전히 속일 수 있지만 더 열심히 노력해야 합니다. zsh용으로만 작성했지만 bash와 ksh에서도 작동합니다.
function mv {
emulate -LR zsh
setopt extended_glob
local i target=
moved=("$@")
while [[ $moved[1] == -* ]]; do
case $moved[1] in
-t?*) target=${moved[1]#*t};;
--t*=*) target=${moved[1]#*=};;
-t|--t*) target=$moved[2]; shift moved;;
-S|--su) shift moved;;
--) break;;
esac
shift moved
done
if [[ -z $target ]]; then
target=$moved[-1]
moved=($moved[1,-2])
fi
target=${target%%/##}
if [[ -d $target ]]; then
for ((i=1; i<=$#moved; i++)); do
moved[$i]=$target/${${moved[i]%%/##}##*/}
done
else
moved=($target)
fi
command mv "$@"
}
그런 다음 mv
명령 후에 , , (제가 가장 많이 사용하는 것입니다) 등과 ls -ld $moved
같은 작업을 수행할 수 있습니다. 예를 들어:cd $moved
xdg-open $moved
mvcd () {
mv "$@" && cd -- $moved[-1]
}