다음과 같이 별표를 사용하여 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).
와일드카드 재사용에 대한 실제 질문에 관해서는 다음과 같습니다.버팀대 확장. 이는 필요한 지점 이전에 확장됩니다. 문서 인용:
버팀대 확장이 수행됩니다.~ 전에다른 확장팩과 다른 확장팩의 특수 문자는 모두 결과에 보존됩니다. 그것은엄격히 문자적인. 배쉬는 않습니다~ 아니다확장 문맥이나 중괄호 사이의 텍스트에 구문 해석을 적용합니다. 매개변수 확장과의 충돌을 피하기 위해 문자열 '${'는 중괄호 확장에 적합한 것으로 간주되지 않습니다.