bash로 숨겨진 파일을 이동하고 dotglob을 재설정하시겠습니까?

bash로 숨겨진 파일을 이동하고 dotglob을 재설정하시겠습니까?

시작점(숨김)과 폴더(반복)를 포함한 모든 파일을 이동하고 싶습니다.

그래서 다음 명령을 사용했습니다.

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를 사용합니다.

관련 정보