tarコマンドを使って引数で指定したディレクトリのjpgファイルのみアーカイブする!


jpgファイルやpngファイルやテキストファイルなど、
たくさんのファイルを1つのフォルダとしてまとめてある、

フォルダがあるとして
そのフォルダを見つけたら上司からある日突然、
「jpqファイルのみ1つにまとめといてくれる?」って

指示があったときに役に立つtarコマンドを使ったShellScriptです!

archiv.sh

#!/bin/bash

readonly SCRIPT_NAME=${0##*/}

archive()
{
  local path="$1"

  if [[ -z $path ]]; then
    printf '\e[31m%s\n\e[m' "${SCRIPT_NAME}: アーカイブしたいファイルがあるディレクトリまたはファイルを指定してください。" 1>&2
    return 1
  fi

  if [[ ! -d $path && ! -f $path ]]; then
    printf '\e[31m%s\n\e[m' "${SCRIPT_NAME}: '$path'は存在しません。" 1>&2
    return 2
  fi

  if [[ -d $path && $path != */ ]]; then
    path+=/
  fi

  # dir変数に正規表現でマッチングした値を代入する。
  # マッチングしなかった場合は現在のディレクトリのパスを代入する
  if [[ $path =~ ^(.*/) ]]; then
    dir=${BASH_REMATCH[1]}
  else
    dir=${PWD}
  fi

  # 相対パスで指定された場合、絶対パスに変換する。
  local basedir=$(cd -- "$dir" && pwd)

  # アーカイブするファイルがあるディレクトリに移動し
  # tarコマンドでjpgファイルをアーカイブする。
  cd -- "$basedir"
  if tar -cf "${basedir}"_jpg.tar -- *.jpg 2> /dev/null; then
    local tardir="${basedir}"_jpg.tar
    printf '\e[36m%s\n\e[m' "アーカイブに成功しました!
${tardir}${tardir##*/}をご確認ください。"
  else
    printf '\e[31m%s\n\e[m' "JPGファイルが見つからず...アーカイブに失敗しました。"
    return 3
  fi
}

if [[ $# -le 0 ]]; then
  printf '\e[31m%s\n\e[m' "${SCRIPT_NAME}: アーカイブしたいファイルがあるディレクトリまたはファイルを指定してください。" 1>&2
  exit 1
fi

result=0
for i in "$@"
do
  archive "$i" || result=$?
done

exit "$result"

使い方

$ ./archiv.sh ディレクトリ or ファイル のパスを相対パス or 絶対パスで指定する

うまくいった場合以下のように表示されます!(青文字で)

$ ./archiv.sh /Users/workspace/tmp
アーカイブに成功しました!
/Users/workspace/tmp_jpg.tarのtmp_jpg.tarをご確認ください。

コードは↓にアップしてますので、クローンして使ってみてください
https://github.com/masanorifunaki/archive

参考

tarコマンドについて詳しくまとめました 【Linuxコマンド集】
https://eng-entrance.com/linux-command-tar