시작점(숨김)과 폴더(반복)를 포함한 모든 파일을 이동하고 싶습니다.
그래서 다음 명령을 사용했습니다.
shopt -s dotglob nullglob
mv ~/public/* ~/public_html/
효과가 있었습니다.
하지만 작업을 마친 후에 재설정해야 할 것이 있나요 shopt -s dotglob nullglob
? 명령이 작동하는 방식이 바뀌지 않습니까 mv
? 왜냐하면 나는 그것을 다시 바꾸고 싶기 때문이다.
답변1
shopt -u nullglob dotglob
예, 현재 셸에서 기본 글로빙 동작을 복원하려면 이후에 이러한 옵션을 설정 해제(사용)해야 합니다.
당신은 이것을 할 수 있습니다
mv ~/public/* ~/public/.* ~/public_html/
분명히 패턴 중 하나가 아무것도 일치하지 않는 경우 설정되지 않으면 여전히 오류가 발생 nullglob
하지만 두 옵션 중 하나를 설정하지 않아도 작동합니다. 디렉토리이기 때문에 이름 바꾸기가 실패했다는 내용이 있을 수도 있지만 .
그렇다고 해서 파일 이동이 중단되는 것은 아닙니다.
더 나은 옵션은 rsync
로컬에서 사용하는 것입니다.
rsync -av ~/public/ ~/public_html/
그런 다음 삭제하십시오 ~/public
.
답변2
취소하세요.
shopt -u dotglob nullglob
don_crissti가 좋은 지적을 했는데, 이에 대해 자세히 설명하겠습니다. dotglob 또는 nullglob이 무엇인지는 질문에서 명확하지 않습니다.이미실행하기 전에 설정하십시오 shopt -s
. 그러므로 맹목적으로 취소하는 것은 올바른 선택이 아닐 수도 있습니다.초기화해. 서브셸에서 설정하면 현재 셸의 설정이 변경되지 않습니다.
( shopt -s dotglob nullglob; mv ~/public/* ~/public_html/ )
답변3
옵션을 재설정하는 스크립트는 다음과 같습니다.
shopt -q dotglob && SHOPT_DOTGLOBAL=true || SHOPT_DOTGLOBAL=false
shopt -s dotglob # include hidden file
echo *
"$SHOPT_DOTGLOBAL" || shopt -u dotglob
shopt -p
또 다른 방법은 print 명령을 사용하는 것입니다 .
SHOPT_DOTGLOBAL_RESET=$(shopt -p dotglob) || true
shopt -s dotglob # include hidden file
echo *
eval "${SHOPT_DOTGLOBAL_RESET}"
( shopt -p dotglob
이 옵션이 설정되지 않은 경우 0이 아닌 종료 상태가 반환되며, errexit
이 옵션이 켜져 있으면 쉘이 종료되므로 || true
이에 주의하십시오.)
답변4
shopt에 의한 모든 변경 사항은 명령을 실행할 때 실행 중인 셸에만 영향을 미칩니다. IE 셸을 닫으면 변경 사항이 사라집니다. 따라서 오랫동안 쉘을 열어두기를 원하지 않는 한(어떤 사람들은 그렇게 하거나 사용하거나 screen
유사함) 이에 대해 걱정할 필요가 없습니다.
개인적으로 저는 @Kusalananda가 제안한 대로 rsync를 사용합니다.