フォローアップです。別の問題出版しました
特定の順序でファイル名を自動的に変更するスクリプトを使用します。
#!/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に付属の-iregex
BSDバージョンのメジャーバージョン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