매월 이름을 딴 디렉토리를 만드는 방법은 무엇입니까?

매월 이름을 딴 디렉토리를 만드는 방법은 무엇입니까?

매달 디렉토리 이름을 만들고 싶습니다. 쉘을 조금 가지고 놀고 나서 나는 다음과 같은 사실을 알아냈습니다.

date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec

그래서 나는 중괄호 확장을 사용 echo {1..12}/01하고 xargs이것을 시도했습니다.

echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b

하지만 처참하게 실패했어요:/ (나중에 신청하고 싶었어요 mkdir). 어떻게 해야 하나요?

답변1

-I, 를 사용하면 xargs단어당 하나의 인수(공백 또는 줄 바꿈으로 구분, 인용 가능)가 아닌 한 줄에 하나의 인수를 얻을 수 있습니다. 이는 없음 -I(및 묵시적 -n)입니다. 따라서 귀하의 예에서는 date한 번만 호출되고 {}후행 개행 문자를 제외한 전체 출력(한 줄)으로 확장됩니다.echo

여기서 할 수 있습니다(이것은 -dGNU 확장입니다):

printf '%s\n' {1..12}/01 | xargs -I {} date -d {} +%b | xargs mkdir --

(월 이름 약어에 공백이나 따옴표 문자가 포함된 로케일에서는 제대로 작동하지 않습니다. GNU에서는 다음 을 xargs사용하여 이 문제를 해결할 수 있습니다.xargs -d '\n' mkdir --

이제 로케일의 월 약어 목록을 얻으려면 로케일을 직접 쿼리하는 것이 더 합리적입니다.

(IFS=';'; set -o noglob; mkdir -- $(locale abmon))

( 범주에서 모든 로캘 데이터 locale -k LC_TIME보기 도 참조하세요.)LC_TIME

또는 로컬로 zsh:

zmodload zsh/langinfo
mkdir -- ${(v)langinfo[(I)ABMON_*]}

적어도 GNU 시스템에서는 일부 로케일에서 월 약어가 고정된 너비로 공백으로 채워집니다.

$ LC_ALL=et_EE.UTF-8 locale title abmon
Estonian locale for Estonia
jaan ;veebr;märts;apr  ;mai  ;juuni;juuli;aug  ;sept ;okt  ;nov  ;dets
$ LC_ALL=zh_TW.UTF-8 locale title abmon
Chinese locale for Taiwan R.O.C.
 1月; 2月; 3月; 4月; 5月; 6月; 7月; 8月; 9月;10月;11月;12月

이 패딩을 제거하고 싶을 수도 있습니다.

선행 공백은 제거되지만 xargs -I후행 공백은 제거되지 않습니다. 그리고 zsh:

zmodload zsh/langinfo
set -o extendedglob
mkdir -- ${${${(v)langinfo[(I)ABMON*]}##[[:space:]]#}%%[[:space:]]#}

답변2

루핑을 시도해 보시겠습니까?

$ for m in {1..12}; do
> date -d "$m"/01 +%b
> done
jan
feb
mar
apr
maj
jun
jul
aug
sep
okt
nov
dec

매월 목차를 만들고 싶다면 다음과 같이 하세요.

for m in {1..12}; do newdir=$(date -d "$m"/01 +%b); mkdir "$newdir"; done

답변3

중괄호 확장이 있고 날짜를 데이터 파일 입력으로 허용하는 쉘에서 다음을 시도하십시오.

echo {01..12}/01$'\n' | date -f- +"mkdir %b"

결과가 만족스러우면 입력을 셸로 파이프할 수 있습니다.

답변4

당신은 여기와 매우 가깝습니다.

문제는 echo가 한 줄을 생성하고 1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01xargs가 공백 대신 필드 구분 기호로 개행 문자를 사용한다는 것입니다.

해결 방법: echo에게 각 필드 사이에 공백을 넣으라고 지시합니다.

echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b

\\n에코 끝에만 삽입합니다.

그런 다음 디렉토리를 추가하자|xargs mkdir

예를 들어

echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir

관련 정보