소스와 대상이 유사한 경우 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

좀 더 입력하고 생각해 보면 다음에서 확장된 글로빙 패턴을 사용할 수 있습니다 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/파일 이름 확장자와 일치하지 않는 다른 디렉터리로 바꾸고 이동을 수행한 후 원하는 이름으로 바꾸는 것입니다.

관련 정보