名前の一部を削除してディレクトリの名前を変更する

名前の一部を削除してディレクトリの名前を変更する

次のようなディレクトリがたくさんあります。

./parent/inventory_control-8118c470fa3811ed9add1fef7e5ef70f/snapshots/automation
./parent/configuration_data-6be54fa0fa3e11ed9add1fef7e5ef70f/snapshots/automation
./parent/zip_code-940ac1d0fa3f11ed9add1fef7e5ef70f/snapshots/automation

ディレクトリ名からハイフンとuuidを削除してディレクトリ名を変更したいと思います。希望の出力は

./parent/inventory_control/snapshots/automation
./parent/configuration_data/snapshots/automation
./parent/zip_code/snapshots/automation

すべてのディレクトリを見つけて名前を変更する1行のコマンドを提案できますか?あるいは、bashスクリプトも役に立ちます。

答え1

 for f in ./parent/*; do mv "$f" "${f%%-*}"; done

(しゃっくり)

答え2

使用真珠rename(すべてのオペレーティングシステムで動作):

rename -n 's/-*//' ./parent/*/

または

rename -n 's@-[[:xdigit:]]+/snapshots/@/snapshots/@' ./parent/*/snapshots/

スイッチの削除-n、別名。試運転あなたの試みが満足なとき実際の名前に変更

意味がある場合は、32進条件を追加できます。

rename -n 's@-[[:xdigit:]]{32}/snapshots/@/snapshots/@'

答え3

zsh シェルの使用:

autoload -Uz zmv
zmv -n '(**/)(?*)-[[:xdigit:]](#c32)(#q/)' '$1$2'

-n満足すれば削除(試運転))

  • autoload機能をzmv次のように表示します。自動的にロード可能これは、関数が最初に呼び出されたときに関数のコードがディレクトリ内のファイルからロードされることを意味します$fpath。を使用する-Uとロード時にエイリアス拡張が完了せず、 を使用すると に-zロードされます。zshシミュレーション、デフォルトのオプションセットを使用します。これらの保護はすべて、機能の動作に影響を与えるカスタマイズを防ぐためです。この機能を頻繁に使用する場合~/.zshrc
  • zmv 'pattern' 'expression'一致するファイルを探す模様結果に応じて名前を変更します。表現する
  • (**/):ディレクトリレベルを一致させます$1
  • (?*):でキャプチャされた少なくとも1文字$2
  • [[:xdigit:]](#c32)c小数点以下の桁数32xdigit
  • (#q/)qファイル形式の一致を制限する修飾子目次
  • $1$2置換を計算します。

zmvdir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888ファイルは深く優先されるため、ディレクトリがある場合は最初に名前を変更してからdir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888名前を変更します。dir/a-FeedADeadBeef654321BadFadedDecaf/bdir/a-FeedADeadBeef654321BadFadedDecafdir/a

また、すべての交換を最初に実行し、データの損失を防ぐために、名前の変更を開始する前に競合を確認します。

関連情報