매달 디렉토리 이름을 만들고 싶습니다. 쉘을 조금 가지고 놀고 나서 나는 다음과 같은 사실을 알아냈습니다.
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
여기서 할 수 있습니다(이것은 -d
GNU 확장입니다):
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/01
xargs가 공백 대신 필드 구분 기호로 개행 문자를 사용한다는 것입니다.
해결 방법: 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