"mv ./* ./subdirdir/"을 수행하는 올바른 방법은 무엇입니까? [복사]

"mv ./* ./subdirdir/"을 수행하는 올바른 방법은 무엇입니까? [복사]

현재 디렉토리에는 많은 파일과 디렉토리가 있습니다. 모든 파일을 하위 디렉터리로 이동하고 싶습니다.

mv ./* subdir/
cannot move ./subdir to a subdirectory of itself...

경고는 무해하지만 mv가 1을 반환하게 되므로 다른 파일이 이동되었는지 확인할 수 없습니다.

cp가 도움이 될 수 있지만 이동할 대용량 파일이 있어서 충분히 효율적이지 않습니다.

스크립트도 작동하는 것 같지만 가능하다면 한 줄을 선호합니다.

답변1

다음을 검색하여 이 작업을 수행할 수 있습니다.

$ find -maxdepth 1 -not -name subdir -print0 | xargs -0 mv -t subdir

어디:

  • -maxdepth 1검색 순회를 현재 디렉터리로 제한합니다(POSIX 옵션은 아니지만 GNU 등에서 사용 가능 find).
  • -print0find가 0바이트로 줄을 종료하도록 지시합니다. 따라서 명령이 POSIX는 아니지만 GNU에서 제공하는 특이한 파일 이름(예: 개행 문자 포함)을 처리할 수 있습니다.find
  • -00바이트를 알려줍니다 xargs. 다시 말하지만 POSIX는 아니지만 예를 들어 GNU에서는 이해됩니다.xargs
  • -t첫 번째 인수가 대상(마지막 인수 아님)임을 나타냅니다 mv. 이는 이 사용 사례에 이상적입니다. 이전과 마찬가지로 옵션은 POSIX에 없지만 예를 들어 GNU에 의해 구현됩니다.mv

답변2

다음과 같이 좀 더 간결한 다른 형식을 시도해 볼 수 있습니다.

mv `ls -A |grep -v <subdir>` <subdir>

여기서 백슬래시 문자는 다음을 나타냅니다.명령 대체즉, mv인수의 일부로 백슬래시로 묶인 명령 출력을 사용하여 실행됩니다.

관련 정보