다음과 같은 폴더가 있다고 가정해 보겠습니다.
$ ls
css-tricks/ django-tutorial/ good-tuts.txt js-tut/ tutorials/ tuts.txt
그들 중 일부는 tut
그들의 이름에 있습니다. tut
해당 이름에 포함된 모든 파일/폴더를 폴더로 이동 하고 싶습니다 tutorials/
. 내가 명령을 실행하면
$ mv *tut* tutorials/
다음 메시지를 받았습니다.
mv: cannot move 'tutorials' to a subdirectory of itself, 'tutorials/tutorials'
이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
내가 생각할 수 있는 트릭 중 하나는 대상 폴더의 이름을 일시적으로 다른 이름으로 바꾸고 명령이 실행된 후 다시 원하는 이름으로 변경하는 것입니다. 그러나 좀 더 우아한 해결책을 알고 싶습니다.
답변1
개인적으로 대화형으로 명령을 실행하려는 상황에서는 그렇게 하면 mv *tut* tutorials
"이동할 수 없습니다" 오류가 발생할 것으로 예상됩니다. 이는 무해하며 다른 파일과 디렉터리는 예상대로 이동됩니다.
명령의 종료 상태는 0이 아니므로 오류를 나타내지만 명령에 종속되는 것이 없으므로 무시할 수 있습니다.
이 경우 다른 이름 앞에는 대시가 붙습니다 tut
.
mv *-tut* tutorials
또는 이와 같은 항목을 이동하려면 python_tut
밑줄을 사용할 수 있습니다.
mv *[_-]tut* tutorials
또는 하위 문자열 앞에 추가 문자를 요구하려면 tut
( tutorials
없음)
mv *?tut* tutorials
좀 더 입력하고 생각해 보면 다음에서 확장된 글로빙 패턴을 사용할 수 있습니다 bash
.
shopt -s extglob
mv *tut!(orials*) tutorials
tut
두 번째 변형은 바로 뒤에 string 이 오지 않는 하위 문자열을 포함하는 모든 항목 과 일치합니다 orials
. 패턴이 일치하지 않으며 tutorials
건너뛰게 됩니다 tutorials1
.
답변2
다음을 사용할 수도 있습니다 find
.
find . -type d -name "*tut*" -not -path "./tutorials" -exec mv -t "tutorials" {} +
답변3
다음 메시지를 받았습니다.
mv: cannot move 'tutorials' to a subdirectory of itself, 'tutorials/tutorials'
오류를 무시하십시오.
완전한 것은 아니고. 전역 패턴이 대상과 일치하기 때문에 오류가 발생한다는 것을 알고 있습니다. 또한 시스템은 디렉토리를 이동할 수 없기 때문에 이것이 의미가 없다는 것을 알고 있으며 파일 시스템이 엉망이 되기 전에 이를 깨달을 만큼 똑똑합니다.
답변4
가장 쉬운 방법은 대상 디렉터리의 이름을 tutorials/
파일 이름 확장자와 일치하지 않는 다른 디렉터리로 바꾸고 이동을 수행한 후 원하는 이름으로 바꾸는 것입니다.