1日1問、半年以内に習得 シェル・ワンライナー160本ノックを頑張ってほぼ毎日取り組む実践中。
問題3の別解1について、数字を小さくして理解に努める。
達成したいこと
1~10のファイルを作成する。
作成したファイル名の先頭に0をつけて、ファイル名を7桁にそろえる。
理解していく
1~10のファイルを作成する。
$ seq 10 | xargs -P$(nproc) touch
$ find
.
./4
./7
./9
./5
./8
./2
./10
./1
./6
./3
$
-
find . | sed 's;^\./;;'
⇒行の先頭(^)の「./」を置換して消す。
正規表現でスラッシュ(/)を使うため、今回は区切り文字としてs///ではなくs;;;(セミコロン)を使っている。@や_でもよい。
$ find . | sed 's;^\./;;'
.
4
7
9
5
8
2
10
1
6
3
$
-
grep -v ^\\.$
⇒行の先頭(^)が「\」で始まり、行の最後($)が「.」のやつ、以外を出力する。
(-v
:あてはまらないものを出力するオプション)
$ find . | sed 's;^\./;;' | grep -v ^\\.$
4
7
9
5
8
2
10
1
6
3
$
-
grep -v ^0
⇒先頭が0でないものを表示する
$ find . | sed 's;^\./;;' | grep -v ^\\.$ | grep -v ^0
4
7
9
5
8
2
10
1
6
3
$
-
awk '{print $1,sprintf("%07d",$1)}'
print $1
⇒ファイル名をそのまま出力
sprintf("%07d",$1)
⇒先頭に0を足して全部で7文字になるようにしてファイル名を最後尾につけているっぽい?
sprintf
は、 文字列をフォーマットして返す関数
$ find . | sed 's;^\./;;' | grep -v ^\\.$ | grep -v ^0 | awk '{print $1,sprintf("%07d",$1)}'
4 0000004
7 0000007
9 0000009
5 0000005
8 0000008
2 0000002
10 0000010
1 0000001
6 0000006
3 0000003
$
-
xargs -n2 -P2 mv
引数を2つずつ渡す。
mv 引数1 引数2
mv 引数3 引数4
:
となる。
$ find . | sed 's;^\./;;' | grep -v ^\\.$ | grep -v ^0 | awk '{print $1,sprintf("%07d",$1)}' | xargs -n2 -P2 mv
$ ll
合計 33660
drwxr-xr-x 2 emi emi 34459648 4月 4 01:53 ./
drwxr-xr-x 10 emi emi 4096 4月 4 00:39 ../
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000001
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000002
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000003
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000004
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000005
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000006
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000007
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000008
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000009
-rw-r--r-- 1 emi emi 0 4月 4 01:27 0000010
$
数を数える
-
find | wc-l
wcコマンドで、findの出力の行数をカウント
$ find | wc -l
11
$
※ファイル1~10と、カレントディレクトリで11
削除
-U
:ソートしない。ディレクトリに含まれる順で表示する。
lsをそのまま実行するとソートされるため、処理を早くする目的で使う。
$ ls -U | xargs -P$(nproc) rm
$
参考