次のようなディレクトリがたくさんあります。
./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
小数点以下の桁数32
x
digit
(#q/)
q
ファイル形式の一致を制限する修飾子目次。$1$2
置換を計算します。
zmv
dir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888
ファイルは深く優先されるため、ディレクトリがある場合は最初に名前を変更してからdir/a-FeedADeadBeef654321BadFadedDecaf/b-11112222333344445555666677778888
名前を変更します。dir/a-FeedADeadBeef654321BadFadedDecaf/b
dir/a-FeedADeadBeef654321BadFadedDecaf
dir/a
また、すべての交換を最初に実行し、データの損失を防ぐために、名前の変更を開始する前に競合を確認します。