如何使用单个命令或行重命名从文件列表中提取的文件

如何使用单个命令或行重命名从文件列表中提取的文件

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

bash

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

答案2

一种方法是要求 shell 从文件中读取每一行,然后使用 shell 参数扩展来提取基本文件名和扩展名:

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德班或者乌班图框,执行:

apt install rename

相关内容