ZSH で大量のファイルの名前を変更する


最近、<function name>/<function name>.js 個のファイルを <function name>/index.js 個持つ代わりに、Netlify 関数のファイル名をきれいにすることにしました.

いつものように、CLI の使用について話していると仮定すると、mv x/x x/index.js を n 回すばやく実行してこのタスクを完了するか、シェル スクリプト、awk、sed、または選択したその他の関連ツールをいじるのにもう少し時間を費やすことができます. CLI スキルを強化します.選択は明らかでした:)

したがって、次のファイル構造を想定しています.

- my-func/
  - my-func.js
- my-func2/
  - my-func2.js
  - foobar.js


これを次のようにシームレスに変換したいと思います (foobar.js は変更しないでください).

- my-func/
  - index.js
- my-func2/
  - index.js
  - foobar.js


これが私の最後のワンライナーです(ZSH準拠):

for i in ./*/*.js; do if [[ $i:t:r == $(echo $i:h | cut -c3-) ]]; then mv -- "$i" "$i:h/index.js"; fi; done


いくつかの調査が必要な興味深い部分 (私の場合) は、:t :r :h 修飾子です.

変数にパスがある場合、修飾子を使用してその一部を抽出できます.

$myFilePath:t -> prints only the filename with extension
$myFilePath:t:r -> prints only the filename without extension
$myFilePath:h -> prints path to the file


これにより、ファイル名 ( for in ./*/*.js ) を親ディレクトリ名 ( $i:t:r ) と比較し、ファイルを "$i:h/index.js"に移動することで、$i:h を使用してファイルを簡単に反復処理し、必要なファイルのみを除外できます. .

任務完了 + もう 1 つのトリックを学びました :)

幸せなコーディングとシェルスクリプト:)