0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェル芸本 問題3の別解1を解読する

Last updated at Posted at 2022-04-03

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
$

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?