【シェルスクリプト】ファイル名が通し番号のファイル群をワンライナーでフォルダ分け
目的
- 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
を指定します。これによって、同階層にあるファイルのみを探索します。
0 件のコメント:
コメントを投稿