Saya ingin membuat nama direktori untuk setiap bulan. Saya tahu, setelah beberapa bermain dengan shell, bahwa:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
Jadi saya telah menggunakan ekspansi brace, echo {1..12}/01
dan mencobanya xargs
:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
Tetapi gagal total: / (setelah itu saya ingin mendaftar mkdir
). Bagaimana saya bisa melakukan ini?
shell-script
xargs
bash-expansion
JammingThebBits
sumber
sumber
ls
menyuntingnya dalam urutan abjad (Apr, Agu, Dec, Feb, Jan, Jul, Jun, Mar, May, Nov, Oct, Sep).mkdir january february [...]
? Kecuali Anda benar-benar perlu membuatnya secara terpisah, tidak perlu melakukannya seperti yang Anda sarankan.Jawaban:
Dengan
-I
,xargs
dapatkan satu argumen per baris sebagai lawan dari default satu argumen per (kosong atau baris baru dibatasi, mungkin dikutip) kata tanpa-I
(dan menyiratkan-n
). Jadi, dalam contoh Andadate
dipanggil hanya sekali dengan{}
diperluas ke seluruh outputecho
(yang ada di satu baris), minus baris baru.Di sini Anda dapat melakukannya (perhatikan bahwa itu
-d
adalah ekstensi GNU):(perhatikan bahwa itu tidak akan berfungsi dengan benar di lokal di mana singkatan nama bulan berisi spasi atau karakter kutipan; dengan GNU
xargs
, Anda dapat mengatasinya dengan menggunakanxargs -d '\n' mkdir --
)Sekarang, untuk mendapatkan daftar singkatan bulan di lokal Anda, menanyakan langsung ke lokal akan lebih masuk akal:
(lihat juga
locale -k LC_TIME
untuk melihat semua data lokal dalamLC_TIME
kategori).Atau secara native di
zsh
:Setidaknya pada sistem GNU, di beberapa lokal, singkatan bulan diisi hingga lebar tetap dengan spasi:
Anda mungkin ingin menghapus lapisan itu.
Ruang utama akan dihapus oleh
xargs -I
, tetapi bukan yang tertinggal. Denganzsh
:sumber
locale abmon
.IFS=';'; set -o noglob; mkdir -- $(locale abmon)
. ;)Coba satu putaran?
Jika Anda ingin membuat direktori untuk setiap bulan, saya akan melakukan sesuatu seperti:
sumber
{1..12}
adalah bashism. Untuk cangkang POSIX, gunakanfor m in $(seq 1 12)...
(meskipun perhatikan bahwaseq
itu sendiri tidak diamanatkan oleh POSIX){1..12}
adalah zshism, disalin kemudian oleh ksh93, bash, dan beberapa shell lainnya.Dalam shell dengan ekspansi brace, dan tanggal menerima input DATAFILE, coba
dan pipa ke shell jika senang dengan hasilnya.
sumber
Perintah Anda tidak berfungsi, karena menggunakan
-I
perubahan pembatas xargs:Anda dapat menambahkan
-d " "
ke xargs untuk membuatnya berfungsi. Tetapi Anda bahkan tidak perlu-I{}
dalam kasus Anda:Coba ini,
sumber
date
menerima opsi setelah argumen non-opsi seperti itu, tidak boleh adaPOSIXLY_CORRECT
variabel di lingkungan.Anda di mana begitu dekat.
Masalahnya adalah bahwa gema menghasilkan satu baris
1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
, dan xargs menggunakan karakter baris baru sebagai pemisah bidang (bukan spasi).Solusinya: Beri tahu gema untuk memberi spasi di antara setiap bidang.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Saya hanya menyisipkan
\\n
di akhir gema.Lalu untuk membuat direktori tambah
|xargs mkdir
misalnya
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir
sumber
Cara paling sederhana dan paling kuat untuk melakukan ini:
Bagaimanapun, ini adalah daftar statis bulan ...
Jika Anda bermaksud menggunakan GNU
date
(di sini dengan asumsi$IFS
GNU yang tidak dimodifikasi dandate
seperti untuk Andadate -d
):sumber