【シェルスクリプト】ファイル名が通し番号のファイル群をワンライナーでフォルダ分け

2021/06/25

UNIX

t f B! P L

【シェルスクリプト】ファイル名が通し番号のファイル群をワンライナーでフォルダ分け

目的

  • notebook_1.ipynb
  • notebook_2.ipynb
  • notebook_35.ipynb
  • notebook_101.ipynb

  • 0
    – notebook_1.ipynb
    – notebook_2.ipynb
  • 3
    – notebook_35.ipynb
  • 10
    – notebook_101.ipynb

のような階層に整理したいとします。
ある階層にファイル数が多くなると、GUIで見たときに結構重くなったりするので。

コマンド

!!!ファイルの移動などを行うため、念の為事前にバックアップをとっておいてください!!!

#!/usr/bin/env bash

set -euC -o pipefail
export LC_ALL=C

find . -maxdepth 1 -type f -regextype posix-egrep -regex '^./[^0-9]*?[0-9]+.*?$' | xargs -IXXX \
bash -c 'dir_prefix="note"; var=$(echo XXX | sed -nr "s/^[^0-9]*?([0-9]+).*$/\1\/10/p" | bc); mkdir -p "${dir_prefix}${var}"; mv XXX "${dir_prefix}${var}"'

xargsの中でbashを起動、変数もセミコロンももりもりなのでもはやワンライナーか怪しいですが、これでできます。

dir_prefixでディレクトリ名のプレフィックス、sedコマンド内の/10でファイル名の通し番号を10で割ったディレクトリ名を生成します。

findはデフォルトで再起的に探索をします。冪等性のため、-maxdepth 1を指定します。これによって、同階層にあるファイルのみを探索します。

ラベル

QooQ