ここで `find` を使う代わりに Zsh に組み込まれたワイルドカードマッチングを使うことはできますか?

ここで `find` を使う代わりに Zsh に組み込まれたワイルドカードマッチングを使うことはできますか?

フォローアップです。別の問題出版しました

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

#!/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]}  # <- the line I hope to replace
  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

find完全にスキップしてZshワイルドカードのみを使用する方法はありますか?役に立つ場合は、Mac OS 10.10でZsh 5.1を使用しています。 OS Xに付属の-iregexBSDバージョンのメジャーバージョンfindは標準ではありません。

ベストアンサー1

私はこれをzsh一人で行うことができると思います(つまり、を使用して):zmv

autoload zmv
for name ($pages)
zmv -Qn "(**/)(*${name}.md)(.N)" "\${1}${pages[(i)${name}]}-\${2}"

実行されていないことを示します-n試運転) すると、次のような結果が出力されます。

mv -- 'some dir/deeper/gfoo.md' 'some dir/deeper/1-gfoo.md'
mv -- 'some dir/zfoo.md' 'some dir/1-zfoo.md'
mv -- afoo.md 1-afoo.md
mv -- nfoo.md 1-nfoo.md
mv -- bar.md 2-bar.md
mv -- baz.md 3-baz.md
.........

結果がうまくいけば、削除-nしてファイルを実際に移動します(-iまたはインタラクティブモードで実行するにはファイルを置き換えます)。


仕組み:
$nameは配列要素であり、${pages[(i)${name}]}は配列内のその要素の位置です。たとえば、次のようにpages=(foo bar baz bom top)なります。

名前($ページ)
printf '%s %s\n' ${ページ[(i)$name]} $name
1 foo
2 bar
3 baz
4 bom
5 top

おすすめ記事