FindとMvを使用してスクリプトを簡素化するために名前変更ユーティリティを使用できますか?

FindとMvを使用してスクリプトを簡素化するために名前変更ユーティリティを使用できますか?

特定の順序でファイル名を自動的に変更するスクリプトを使用します。

#!/usr/bin/env zsh

pages=($(sed -n '/page_order/,/^$/ p' _config.yml | tail -n +2 | sed 's/ - //'))
npages=${#pages}
for ((i=1; i<=$npages; i++)); do
  page=${pages[$i]}
  old=${(f)$(gfind . -iregex ".*/.*${page}.md")[1]}
  pagenumber=$(printf '%0*d\n' ${#npages} $i)
  new="${pagenumber}-${page}.md"
  mv -i $old $new
done

_config.ymlアイテムはどこにありますか?

page_order:
 - foo
 - bar
 - baz

ファイルfoo.md bar.md baz.md名は自動的に1-foo.md 2-bar.m 3-baz.md

renameこのユーティリティを使用してこのプロセスを簡素化する方法はありますか?私はMac OS X 10.10を使用しています。

(純粋なzshソリューションについては、以下を参照してください。ここで `find` を使う代わりに Zsh に組み込まれたワイルドカードマッチングを使うことはできますか?)

ベストアンサー1

あなたがリストを得ることができれば文書renameこれはPerlのパラメータセットで簡単に実行できます。

rename 'no warnings; $a++; s!^(.*/)?(.*)!$1$a-$2!' "$@"

変数$a$bはPerlであらかじめ宣言されたグローバル変数であるため、式全体がループ内で考慮されなければならず、それに応じてスコープが必要ですが、実行期間中はその値を保持します。置換自体は現在の値を$aファイル名の一部として挿入するため、引数もパス名になる可能性があります。 (パラメータをdirnamesums に分割してbasename$1 および $2 コンポーネントを生成します。)

pragmano warningsは交換を中止し、パス名コンポーネントが欠落していると文句を言います。通常、これは必須ではありませんが、このrenameコマンドを使用すると追加の警告が可能になると思います。

-n試運転に追加するか、-v事後確認タスクに追加します。

または、Perlフラグメントを使用して取得したパラメータを取得してファイルセットに適用することもできます。しかし、そうしたら、PerlでYAMLを解析することもできます。

おすすめ記事