tạo thư mục chỉ với tên tháng


8

Gửi câu hỏi bởi sự tò mò, tôi muốn tạo thư mục như tháng 1, tháng 2 ... đến tháng 12 để tôi tạo chúng bằng cách đặt tên riêng. ( mkdir January February.... vv) Có thể tạo thư mục hoặc tên tệp với tên của tất cả các tháng một cách dễ dàng không?

ví dụ: touch {1..10}sẽ tạo 10 tệp 1,2,3 ... 10 một cách dễ dàng, như thế này có giải pháp nào khác để tạo các tệp hoặc thư mục có tên tháng không?

Câu trả lời:


18

POSIXly,

(IFS=';'; set -f; mkdir -- $(locale mon))

Lưu ý, đó là tên tháng trong ngôn ngữ hiện tại. Thay thế bằng LC_ALL=C locale monnếu bạn muốn những người Anh bất kể ngôn ngữ của người dùng.

Với zsh, bạn cũng có thể sử dụng $langinfomảng kết hợp đặc biệt (trong zsh/langinfomô-đun):

zmodload zsh/langinfo
eval mkdir -- '$langinfo[MON_'{1..12}']'

Tuy nhiên

mkdir -- ${(s:;:)"$(locale mon)"}

sẽ ngắn hơn Trong rc/ esđó là các shell khác với các toán tử phân tách trong đó bạn có thể chỉ định các dấu phân cách (ngoài thông qua $IFScài đặt toàn cục đó như trong các shell giống như Bourne):

mkdir -- ``';'{locale mon}

9

Sửa đổi kịch bản của heemayl

for i in {1..12} ; do
   mkdir $(LC_TIME=C date +%B -d "${i}/15")
done

Không có vòng lặp

LC_TIME=C date +%B -f <(printf "%d/15\n" {1..12}) | xargs mkdir

8

Bạn có thể sử dụng một cấu trúc lặp với GNU datemà mất +1 month, +2 monthsgiống như đầu vào:

i=1; while ((i<=12)); do mkdir "$(date -d "+$i month" '+%B')"; ((i++)); done

Thí dụ:

$ i=1; while ((i<=12)); do date -d "+$i month" '+%B'; ((i++)); done
September
October
November
December
January
February
March
April
May
June
July
August

3
Đặt i thành 5 khi bắt đầu bắt đầu từ jan.
123

2
@ 123 Nói lại sau 22 ngày;)
heemayl

4

Python biết tất cả tên của các tháng:

mkdir $(python -c 'import calendar; print(" ".join(calendar.month_name))')

Hoặc, chúng ta có thể sử dụng python trực tiếp để tạo thư mục:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'

Trung tâm của những điều trên là [os.mkdir(m) for m in calendar.month_name if m]một thư mục cho mỗi tháng trong calendar.month_name. Điều này sẽ tạo ra một thông báo lỗi và thoát nếu bất kỳ thư mục nào đã tồn tại. Nếu chúng ta muốn tránh điều đó, chúng ta có thể kiểm tra sự tồn tại của các thư mục trước khi gọi mkdir:

python -c 'import calendar,os;[os.mkdir(m) for m in calendar.month_name if m and not os.path.exists(m)]'

Thí dụ:

$ python -c 'import calendar,os;[os.mkdir(m) for m in calendar.month_name if m]'
$ ls
April   December  January  June   May       October
August  February  July     March  November  September

Quốc tế hóa

Stéphane Chazelas chỉ ra rằng ở trên in tên tháng tiếng Anh. Để có được tên tháng địa phương, ông gợi ý:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'

@ StéphaneChazelas Cảm ơn. Tôi cập nhật câu trả lời. (Bạn locale monlà cấp trên và đã có +1 của tôi.)
John1024

2

Sử dụng ngôn ngữ và giả sử Linux (đầu ra của locale(1)là khác nhau trên các hệ thống khác) và bash(1):

#! /bin/sh
(
    eval "$( locale -k -c LC_TIME | grep ^mon= )" || exit
    IFS=\; months=($mon)
    mkdir "${months[@]}"
)

months=($mon)không phải là shcú pháp. Đó là ksh93hoặc bashcú pháp.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.