複数ファイルを xargs で並列処理して各並列処理ごとに異なるファイル名で圧縮する。

小ネタです。表題の通り複数ファイルを xargs で並列処理して各並列処理ごとに異なるファイル名で圧縮してみますやで。
彡(ﾟ)(ﾟ)

# 1. 圧縮用スクリプト(arhcive_shell.sh)
ファイルを圧縮するスクリプトです。xargs の引数としてこのスクリプトを実行します。

```shell:archive_shell.sh
#!/bin/bash
# sleep
sleep 1

# start message
echo "$(date +"%Y/%m/%d %H:%M:%S") start pid[$$] numArgs[$#] args[$@]"

# filename setting
filename=$(date +"foo_%Y%m%d_%H%M%S_$$.zip")

# compress
zip -r "${filename}" "$@"

# complete message
echo "$(date +"%Y/%m/%d %H:%M:%S") complete pid[$$] numArgs[$#] args[$@]"
```

# 2. 実行サンプル

30ファイル(foo_1.txt ～ foo_30.txt) を 4ファイルずつ 3並列 で圧縮してみます。

```shell
[oracle@localhost xargs_zip]$ ls -la
total 8
drwxr-xr-x. 2 oracle oinstall 4096 Jun 30 08:00 .
drwxr-xr-x. 3 oracle oinstall   23 Jun 30 07:38 ..
-rwxr-x---. 1 oracle oinstall  314 Jun 30 07:57 archive_shell.sh
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_10.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_11.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_12.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_13.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_14.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_15.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_16.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_17.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_18.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_19.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_1.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_20.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_21.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_22.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_23.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_24.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_25.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_26.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_27.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_28.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_29.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_2.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_30.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_3.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_4.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_5.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_6.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_7.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_8.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_9.txt
[oracle@localhost xargs_zip]$
```

以下のコマンドを実行します。xargs の -nオプションが引数(ファイル数)の数、-Pオプションが並列度になります。

```shell
ls -1 foo*.txt | xargs -n 4 -P 3 ./archive_shell.sh
```

実行ログは以下の通りです。

```shell
[oracle@localhost xargs_zip]$ ls -1 foo*.txt | xargs -n 4 -P 3 ./archive_shell.sh
2023/06/30 08:05:08 start pid[9111] numArgs[4] args[foo_14.txt foo_15.txt foo_16.txt foo_17.txt]
  adding: foo_14.txt (stored 0%)
  adding: foo_15.txt (stored 0%)
  adding: foo_16.txt (stored 0%)
  adding: foo_17.txt (stored 0%)
2023/06/30 08:05:08 start pid[9110] numArgs[4] args[foo_10.txt foo_11.txt foo_12.txt foo_13.txt]
2023/06/30 08:05:08 complete pid[9111] numArgs[4] args[foo_14.txt foo_15.txt foo_16.txt foo_17.txt]
2023/06/30 08:05:08 start pid[9112] numArgs[4] args[foo_18.txt foo_19.txt foo_1.txt foo_20.txt]
  adding: foo_10.txt (stored 0%)
  adding: foo_11.txt (stored 0%)
  adding: foo_12.txt (stored 0%)
  adding: foo_13.txt (stored 0%)
  adding: foo_18.txt (stored 0%)
  adding: foo_19.txt (stored 0%)
  adding: foo_1.txt (stored 0%)
  adding: foo_20.txt (stored 0%)
2023/06/30 08:05:08 complete pid[9110] numArgs[4] args[foo_10.txt foo_11.txt foo_12.txt foo_13.txt]
2023/06/30 08:05:08 complete pid[9112] numArgs[4] args[foo_18.txt foo_19.txt foo_1.txt foo_20.txt]
2023/06/30 08:05:09 start pid[9124] numArgs[4] args[foo_21.txt foo_22.txt foo_23.txt foo_24.txt]
  adding: foo_21.txt (stored 0%)
  adding: foo_22.txt (stored 0%)
  adding: foo_23.txt (stored 0%)
  adding: foo_24.txt (stored 0%)
2023/06/30 08:05:09 complete pid[9124] numArgs[4] args[foo_21.txt foo_22.txt foo_23.txt foo_24.txt]
2023/06/30 08:05:09 start pid[9131] numArgs[4] args[foo_25.txt foo_26.txt foo_27.txt foo_28.txt]
2023/06/30 08:05:09 start pid[9132] numArgs[4] args[foo_29.txt foo_2.txt foo_30.txt foo_3.txt]
  adding: foo_25.txt (stored 0%)
  adding: foo_26.txt (stored 0%)
  adding: foo_27.txt (stored 0%)
  adding: foo_28.txt (stored 0%)
  adding: foo_29.txt (stored 0%)
  adding: foo_2.txt (stored 0%)
  adding: foo_30.txt (stored 0%)
  adding: foo_3.txt (stored 0%)
2023/06/30 08:05:09 complete pid[9131] numArgs[4] args[foo_25.txt foo_26.txt foo_27.txt foo_28.txt]
2023/06/30 08:05:09 complete pid[9132] numArgs[4] args[foo_29.txt foo_2.txt foo_30.txt foo_3.txt]
2023/06/30 08:05:10 start pid[9139] numArgs[4] args[foo_4.txt foo_5.txt foo_6.txt foo_7.txt]
  adding: foo_4.txt (stored 0%)
  adding: foo_5.txt (stored 0%)
  adding: foo_6.txt (stored 0%)
  adding: foo_7.txt (stored 0%)
2023/06/30 08:05:10 complete pid[9139] numArgs[4] args[foo_4.txt foo_5.txt foo_6.txt foo_7.txt]
2023/06/30 08:05:10 start pid[9149] numArgs[2] args[foo_8.txt foo_9.txt]
  adding: foo_8.txt (stored 0%)
  adding: foo_9.txt (stored 0%)
2023/06/30 08:05:10 complete pid[9149] numArgs[2] args[foo_8.txt foo_9.txt]
```

実行結果は以下の通りです。

```shell
[oracle@localhost xargs_zip]$ ls -la
total 40
drwxr-xr-x. 2 oracle oinstall 4096 Jun 30 08:05 .
drwxr-xr-x. 3 oracle oinstall   23 Jun 30 07:38 ..
-rwxr-x---. 1 oracle oinstall  314 Jun 30 07:57 archive_shell.sh
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_10.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_11.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_12.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_13.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_14.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_15.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_16.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_17.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_18.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_19.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_1.txt
-rw-r--r--. 1 oracle oinstall  614 Jun 30 08:05 foo_20230630_080508_9110.zip
-rw-r--r--. 1 oracle oinstall  614 Jun 30 08:05 foo_20230630_080508_9111.zip
-rw-r--r--. 1 oracle oinstall  612 Jun 30 08:05 foo_20230630_080508_9112.zip
-rw-r--r--. 1 oracle oinstall  614 Jun 30 08:05 foo_20230630_080509_9124.zip
-rw-r--r--. 1 oracle oinstall  614 Jun 30 08:05 foo_20230630_080509_9131.zip
-rw-r--r--. 1 oracle oinstall  610 Jun 30 08:05 foo_20230630_080509_9132.zip
-rw-r--r--. 1 oracle oinstall  606 Jun 30 08:05 foo_20230630_080510_9139.zip
-rw-r--r--. 1 oracle oinstall  314 Jun 30 08:05 foo_20230630_080510_9149.zip
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_20.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_21.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_22.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_23.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_24.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_25.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_26.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_27.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_28.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_29.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_2.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_30.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_3.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_4.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_5.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_6.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_7.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_8.txt
-rw-r--r--. 1 oracle oinstall    0 Jun 30 08:00 foo_9.txt
[oracle@localhost xargs_zip]$ zipinfo foo_20230630_080508_9110.zip
Archive:  foo_20230630_080508_9110.zip
Zip file size: 614 bytes, number of entries: 4
-rw-r--r--  3.0 unx        0 bx stor 23-Jun-30 08:00 foo_10.txt
-rw-r--r--  3.0 unx        0 bx stor 23-Jun-30 08:00 foo_11.txt
-rw-r--r--  3.0 unx        0 bx stor 23-Jun-30 08:00 foo_12.txt
-rw-r--r--  3.0 unx        0 bx stor 23-Jun-30 08:00 foo_13.txt
4 files, 0 bytes uncompressed, 0 bytes compressed:  0.0%
[oracle@localhost xargs_zip]$
[oracle@localhost xargs_zip]$ zipinfo foo_20230630_080510_9149.zip
Archive:  foo_20230630_080510_9149.zip
Zip file size: 314 bytes, number of entries: 2
-rw-r--r--  3.0 unx        0 bx stor 23-Jun-30 08:00 foo_8.txt
-rw-r--r--  3.0 unx        0 bx stor 23-Jun-30 08:00 foo_9.txt
2 files, 0 bytes uncompressed, 0 bytes compressed:  0.0%
[oracle@localhost xargs_zip]$
```

期待通り8ファイルのzipファイルがファイル名違いで生成されました。

# 3. まとめ
ワンライナーでもイケる気がするんですが上手く行きませんでした。
こうすればワンライナーできるよ、という方は教えて下さい。
彡(^)(^)

# Appendix
下記記事を参考にしました。ありがとうございます。

https://qiita.com/shungok/items/f852be01f08568991f18