매월 이름이 지정된 디렉토리는 어떻게 만듭니 까?


8

매월 디렉토리 이름을 만들고 싶습니다. 나는 껍질을 가지고 노는 후에 다음과 같이 알고있다.

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). 어떻게해야합니까?


4
이 프로그램을 과도하게 프로그래밍하는 것 같습니다. 이유가있는 경우 단순히 "mkdir"Jan "; mkdir"Feb "; ..."12 줄을 쓰지 않는 이유를 설명하면 도움이됩니다. 여러 번 해야하는 경우 코드를 함수에 넣고 필요에 따라 호출하십시오.
jamesqf

4
숫자 01-12 대신 월 이름 으로 디렉토리 이름을 지정하는 이유는 무엇 입니까? ls알파벳 순서 (4 월, 8 월, 12 월, 2 월, 1 월, 7 월, 6 월, 3 월, 5 월, 11 월, 10 월, 9 월)로 알파벳 순서대로 정렬 하는 것이 어색해야합니다 .
user1024

2
@jamesqf 간단하게 할 수 있는데 왜 그렇게 mkdir january february [...]하겠습니까? 실제로 개별적으로 작성해야하는 경우가 아니라면 제안한대로 수행 할 필요가 없습니다.
Pryftan

@ user1024 나는 일반적으로 당신과 동의하지만 한 유스 케이스에는 월 이름이 있습니다 (소문자는 낮음). 또 다른 1 월 1 일 등이 있습니다. 누가 말할 수 있습니까? 여러 가지 이유가 있거나 더 좋을 수도 있습니다. (그러나 예-정렬이 문제인 경우 ...)
Pryftan

@Pryftan : 짧은 줄에 대한 개인적인 선호 만 :-) 또한 나중에 "01Jan"으로 변경하려면 편집자가 "c / / 01/12 1"을 변경하는 것보다 변경하는 것이 더 쉽습니다. 한 줄.
jamesqf

답변:


17

-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:]]#}

좋은! 에 대해 몰랐습니다 locale abmon.
maulinglawns

좋은 답변이지만 tl; dr : IFS=';'; set -o noglob; mkdir -- $(locale abmon). ;)
Skippy le Grand Gourou

9

루프를 시도?

$ 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

그것은 {1..12}bashism입니다. 는 POSIX 쉘의 경우, 사용 for m in $(seq 1 12)...(참고하지만 seq그 자체가 POSIX에 의해 위임되지 않음)
라도 반 Garabík

2
기술적으로 @ RadovanGarabík {1..12}은 나중에 ksh93, bash 및 여러 다른 쉘에 의해 복사 된 zshism입니다.
Stéphane Chazelas

5

중괄호 확장과 날짜가 DATAFILE 입력을 허용하는 쉘에서 시도하십시오.

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

결과에 만족하면 쉘에 파이프하십시오.


5

-Ixargs의 분리 문자 를 변경 하여 명령이 작동하지 않습니다 .

-I replace-str
초기 인수에서 replace-str 발생을 표준 입력에서 읽은 이름으로 바꿉니다. 또한 인용되지 않은 공백은 입력 항목을 종료하지 않습니다. 대신 구분 기호는 개행 문자입니다.

-d " "xargs에 추가 하여 작동하도록 할 수 있습니다. 그러나 -I{}귀하의 경우에는 필요하지 않습니다 .

이 시도,

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

1
GNU date가 옵션이 아닌 인수 뒤에 옵션을 허용 POSIXLY_CORRECT하려면 환경에 변수 가 없어야 합니다.
Stéphane Chazelas

3

너무 가까이있는 당신.

문제는 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 -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


1

가장 간단하고 강력한 방법 :

mkdir jan feb mar apr maj jun jul aug sep okt nov dec

결국 정적 개월 목록입니다 ...

당신은 GNU를 사용하여 의도하는 경우 date(수정되지 않은 여기에 가정 $IFS및 GNU date당신을 위해 등 date -d)

mkdir $( printf '%s\n' {1..12}/01 | date -f - +%b )

2
단, 사용자 언어로 월 이름 약어를 만들지 않습니다.
Stéphane Chazelas

@ StéphaneChazelas 그들이 나와 같은 스웨덴 인이
아닌 한
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.