파일 이름의 와일드카드를 참조하세요.

파일 이름의 와일드카드를 참조하세요.

다음과 같이 별표를 사용하여 bash에서 특정 형식의 이름을 가진 파일을 추출하기 위해 와일드카드를 사용할 수 있다는 것을 알고 있습니다.

$ ls
a01     a02     a03     a04     a05     a06     a07     a08     a09     b01     b02     b03     b04     b05     b06     b07     b08     b09
$ ls a*
a01     a02     a03     a04     a05     a06     a07     a08     a09
$ ls b*
b01     b02     b03     b04     b05     b06     b07     b08     b09

그러나 a로 시작하는 모든 파일을 라는 디렉터리로 이동 a하고 b로 시작하는 모든 파일을 라는 디렉터리로 이동하는 것과 같은 작업을 수행하려면 b명령 하나로 어떻게 해야 합니까?

다음과 같이 할 수 있습니까?

$ mv *0* */

하지만 어떻게든 이동 인수에서 첫 번째 별표를 참조합니까?

답변1

하나의 명령, 한 줄:

for n in *;do [ -f "$n" ] && case "$n" in a*) mv "$n" a/;; b*) mv "$n" b/;; esac; done

또는 파일 이름에서 디렉토리 이름을 파생시킬 수 있지만 처음에는 표시하지 않았으므로 더 긴 줄로 추정됩니다. 예를 들어 루프의 문은 다음과 같습니다(첫 번째 시도).

d=$(echo "$n" | sed -e 's/^\(.\).*/\1/'); [ -f "$n" ] && mv "$n" $d/

디렉토리 이름을 얻기 위해 주어진 파일 이름의 첫 글자를 사용합니다. 비교

[ -f "$n" ] && case "$n" in a*) mv "$n" a/;; *b) mv "$n" b/;; esac

사례 진술을 위해. 실제로 더 길지는 않지만 즉석에서 입력하기가 더 어렵습니다. 언급 되었으므로 bash하위 문자열 구문을 사용하여 ${parameter:offset:length}해당 줄을 줄일 수 있습니다.

d=${n:0:1}; [ -f "$n" ] && mv "$n" $d/

또는

[ -f "$n" ] && mv "$n" ${n:0:1}/

(나는 이것을 bash 확장으로 기억하며 찾을 수 없습니다.POSIX).

와일드카드 재사용에 대한 실제 질문에 관해서는 다음과 같습니다.버팀대 확장. 이는 필요한 지점 이전에 확장됩니다. 문서 인용:

버팀대 확장이 수행됩니다.~ 전에다른 확장팩과 다른 확장팩의 특수 문자는 모두 결과에 보존됩니다. 그것은엄격히 문자적인. 배쉬는 않습니다~ 아니다확장 문맥이나 중괄호 사이의 텍스트에 구문 해석을 적용합니다. 매개변수 확장과의 충돌을 피하기 위해 문자열 '${'는 중괄호 확장에 적합한 것으로 간주되지 않습니다.

관련 정보