!["mv ./* ./subdirdir/"을 수행하는 올바른 방법은 무엇입니까? [복사]](https://linux55.com/image/68037/%22mv%20.%2F*%20.%2Fsubdirdir%2F%22%EC%9D%84%20%EC%88%98%ED%96%89%ED%95%98%EB%8A%94%20%EC%98%AC%EB%B0%94%EB%A5%B8%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
현재 디렉토리에는 많은 파일과 디렉토리가 있습니다. 모든 파일을 하위 디렉터리로 이동하고 싶습니다.
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
).-print0
find가 0바이트로 줄을 종료하도록 지시합니다. 따라서 명령이 POSIX는 아니지만 GNU에서 제공하는 특이한 파일 이름(예: 개행 문자 포함)을 처리할 수 있습니다.find
-0
0바이트를 알려줍니다xargs
. 다시 말하지만 POSIX는 아니지만 예를 들어 GNU에서는 이해됩니다.xargs
-t
첫 번째 인수가 대상(마지막 인수 아님)임을 나타냅니다mv
. 이는 이 사용 사례에 이상적입니다. 이전과 마찬가지로 옵션은 POSIX에 없지만 예를 들어 GNU에 의해 구현됩니다.mv
답변2
다음과 같이 좀 더 간결한 다른 형식을 시도해 볼 수 있습니다.
mv `ls -A |grep -v <subdir>` <subdir>
여기서 백슬래시 문자는 다음을 나타냅니다.명령 대체즉, mv
인수의 일부로 백슬래시로 묶인 명령 출력을 사용하여 실행됩니다.