소스와 대상이 유사한 경우 bash에서 와일드카드 확장을 사용하는 가장 좋은 방법은 무엇입니까?

소스와 대상이 유사한 경우 bash에서 와일드카드 확장을 사용하는 가장 좋은 방법은 무엇입니까?

다음과 같은 폴더가 있다고 가정해 보겠습니다.

$ 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

좀 더 입력하고 생각해보면 다음에서 확장된 globbing 패턴을 사용할 수 있습니다 bash.

shopt -s extglob
mv *tut!(orials*) tutorials

tut이 두 번째 변형은 문자열 바로 뒤에 오지 않는 부분 문자열을 포함하는 모든 항목과 일치합니다 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'

오류를 무시하십시오.

아뇨, 정말요. glob 패턴이 대상과 일치하므로 오류가 발생한다는 것을 알고 있습니다. 또한 시스템은 디렉터리를 자체 내부로 이동할 수 없고 파일 시스템을 엉망으로 만들기 전에 이를 인식할 만큼 똑똑하기 때문에 이것이 아무 의미도 없다는 것을 알고 있습니다.

답변4

가장 쉬운 방법은 대상 디렉터리의 이름을 tutorials/파일 이름 확장과 일치하지 않는 다른 이름으로 바꾸고, 이동을 수행한 후 원하는 대로 이름을 바꾸는 것입니다.

관련 정보