単一のコマンドまたは行を使用してファイルリストから抽出されたファイルの名前を変更する方法

単一のコマンドまたは行を使用してファイルリストから抽出されたファイルの名前を変更する方法

my-project次のファイルツリーに名前が付けられたプロジェクトがあります。

私のプロジェクト/(以前)
.
├── src
│   ├── index.html
│   ├── main.js
│   ├── normalize.js
│   ├── routes
│   │   ├── index.js
│   │   └── Home
│   │       ├── index.js
│   │       └── assets
│   ├── static
│   ├── store
│   │   ├── createStore.js
│   │   └── reducers.js
│   └── styles
└── project.config.js

今私は欲しい次のファイルの名前を変更します。-origファイルタイプ拡張子の前に文字列を追加します。

名前を変更するファイル.txt
src/main.js
src/routes/index.js
src/store/reducers.js
project.config.js

(ファイルの内容をまったく変更したくありません。)

最終ファイルツリーは次のとおりです。

私のプロジェクト/(以降)
.
├── src
│   ├── index.html
│   ├── main-orig.js
│   ├── normalize.js
│   ├── routes
│   │   ├── index-orig.js
│   │   └── Home
│   │       ├── index.js
│   │       └── assets
│   ├── static
│   ├── store
│   │   ├── createStore.js
│   │   └── reducers-orig.js
│   └── styles
└── project.config-orig.js

1行またはコマンドでこれを行う方法はありますか?

答え1

存在するbash

while read ; do mv "$REPLY" "${REPLY%.js}-orig.js" ; done < files-to-rename.txt

答え2

1つのアプローチは、シェルにファイルの各行を読み取るように要求し、シェルパラメータ拡張を使用してデフォルトのファイル名と拡張子を抽出することです。

while IFS= read -r filename
do
  base=${filename%.*}
  extension=${filename##*.}
  echo mv -- "my-project/$filename" "my-project/${base}-orig.${extension}"
done < files-to-rename.txt

echo出力が正しいと思われる場合は削除してください。

答え3

for i in `cat files-to-rename.txt`; do postfix=${i/#*\./}; mv $i ${i/%.$postfix/-orig.$postfix}; done;

これはjsだけでなく、すべてのサフィックスで機能します。しかし、自分の利益のためにgitまたはsvnを試してみてください。 tarコマンドでさえ、これよりも優れています。

答え4

renameコマンドを使用してください。まず、何も変更しない詳細なテスト実行を実行します。

rename -n -v 's/.js$/-orig.js/' $(find my-project/)

これが正しいと思われる場合は、削除して-n実際にファイル名を変更してください。

rename    -v 's/.js$/-orig.js/' $(find my-project/)

rename注:次の場所に設置する予定ダーバンまたはUbuntuボックスで次を実行します。

apt install rename

関連情報