Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 通过将一个模式替换为另一个模式,以递归方式重命名存储库和文件名_Bash_Rename_File Rename_Batch Rename - Fatal编程技术网

Bash 通过将一个模式替换为另一个模式,以递归方式重命名存储库和文件名

Bash 通过将一个模式替换为另一个模式,以递归方式重命名存储库和文件名,bash,rename,file-rename,batch-rename,Bash,Rename,File Rename,Batch Rename,我希望递归地重命名包含给定模式的特定目录下的所有存储库和文件名 我想我通过以下命令找到了一个潜在的解决方案: find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+ 但是,似乎我没有正确的rename命令 我安装了PerlRename软件包,但仍然没有基于Perl的Rename命令可用。要使用此命令,我可以做些什么 是否有此重命名解决方案的替代方案 假设我有以下存储库和文件: BOOK1/ BOOK1/BOOK1

我希望递归地重命名包含给定模式的特定目录下的所有存储库和文件名

我想我通过以下命令找到了一个潜在的解决方案:

find /your/target/path/ -execdir rename 's/special/regular/' '{}' \+
但是,似乎我没有正确的
rename
命令

我安装了PerlRename软件包,但仍然没有基于Perl的
Rename
命令可用。要使用此命令,我可以做些什么

是否有此
重命名
解决方案的替代方案

假设我有以下存储库和文件:

BOOK1/
BOOK1/BOOK1_summary.txt
BOOK1/BOOK1_chapter1/BOOK1_chapter1.txt
我想在存储库和文件名中将所有出现的BOOK1重命名为BOOK-01

BOOK1-01/
BOOK1-01/BOOK1-01_summary.txt
BOOK1-01/BOOK1-01_chapter1/BOOK1-01_chapter1.txt

您可以使用
重命名
PERL
实用程序,该实用程序可以从链接下载

干运行输出

rename(BOOK1/BOOK1_summary.txt, BOOK1/BOOK1-01_summary.txt)
rename(BOOK1/BOOK1_chapter1/BOOK1_chapter1.txt, BOOK1/BOOK1_chapter1/BOOK1-01_chapter1.txt)
rename(BOOK1/BOOK1_chapter1, BOOK1/BOOK1-01_chapter1)
rename(BOOK1, BOOK1-01)
 ls -R BOOK1-01/ # Used a recursive listing here.
BOOK1-01/:
BOOK1-01_chapter1  BOOK1-01_summary.txt

BOOK1-01/BOOK1-01_chapter1:
BOOK1-01_chapter1.txt
验证干运行结果后,从
rename
中删除
-n
选项

实际产出

rename(BOOK1/BOOK1_summary.txt, BOOK1/BOOK1-01_summary.txt)
rename(BOOK1/BOOK1_chapter1/BOOK1_chapter1.txt, BOOK1/BOOK1_chapter1/BOOK1-01_chapter1.txt)
rename(BOOK1/BOOK1_chapter1, BOOK1/BOOK1-01_chapter1)
rename(BOOK1, BOOK1-01)
 ls -R BOOK1-01/ # Used a recursive listing here.
BOOK1-01/:
BOOK1-01_chapter1  BOOK1-01_summary.txt

BOOK1-01/BOOK1-01_chapter1:
BOOK1-01_chapter1.txt

注意:带有find的
-depth
选项是这里的关键。
find手册页
说它先处理每个目录的内容,然后再处理目录本身

“重命名”命令在我这边没有-n选项。我直接尝试不使用它,但它给了我以下错误消息:“重命名:参数不足”。此外,我看到您在“重命名”命令末尾使用了“3/s”。我认为这是因为在我的示例中,每条路径最多出现3次,对吗?如果有更多,我可以用“/g”来代替吗?它不是
3/s
而是
$3
。请注意,我使用了三个
(stuff)
。括号内的任何内容都可以重复使用,第一次匹配使用
$1
,第二次匹配使用
$2
,依此类推。此处不应使用全局选项
g
,因为它对该解决方案有害。@thbtmntgn我在
find
命令中做了一个小更改。请试试新的。如果没有
-n
选项,请在手册页中搜索
重命名
,并查找提供
干运行
选项的选项。在我删除的
rename
脚本末尾有一个流氓
s
。试试新的,如果你有任何运气,请告诉我:)我重新运行了你的命令,并得到了“重命名:没有足够的参数”错误。我使用的“重命名”命令似乎没有干运行选项。只有四个选项:-v/--verbose-->解释正在执行的操作,-s/--symlink-->对symlink目标执行操作,-h/--help-->显示此帮助并退出,-v/--version-->输出版本信息并退出安装“File::Rename”Perl包和“cpan”为我解决了问题。它在“/usr/local/bin”中创建了“rename”可执行文件