微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重命名当前目录和所有子目录中的文件名

我有不同的目录和子目录中有以下名称的4个文件

tag0.txt,tag1.txt,tag2.txt and tag3.txt

并希望在所有目录和子目录tag0a.txt,tag1a.txt,tag2a.txt and tag3a.txt它们重命名为tag0a.txt,tag2a.txt and tag3a.txt 。

任何人都可以帮我使用shell脚本?

干杯

在awk中将tr的结果作为第二个parameter passing

无法使crontab工作

Bashinput多个文件

bash函数Nginx文件进行完整性检查

如何更改许多文件中的编码?

Linux超时命令和退出代码

在bash脚本中,如何从使用eval命令时执行的程序获取PID?

无法将程序与双击Tab中的Bash的总数相匹配

有没有任何标准的机制或约定来防止Bash环境variables名称冲突?

有5个脚本在任何给定的时间运行

$ shopt -s globstar $ rename -n 's/.txt$/a.txt/' **/*.txt foo/bar/tag2.txt renamed as foo/bar/tag2a.txt foo/tag1.txt renamed as foo/tag1a.txt tag0.txt renamed as tag0a.txt

检查结果后删除-n以重新命名 – 这是“空运行”选项。

这当然可以用find来完成:

find . -name 'tag?.txt' -type f -exec bash -c 'mv "$1" ${1%.*}a.${1##*.}' -- {} ;

这是一个posix shell脚本(用短划线选中):

visitDir() { local file for file in "$1"/*; do if [ -d "$file" ]; then visitDir "$file"; else if [ -f "$file" ] && echo "$file"|grep -q '^.*/tag[0-3].txt$'; then newfile=$(echo $file | sed 's/.txt/a.txt/') echo mv "$file" "$newfile" fi fi done } visitDir .

如果你可以使用bashisms,只需用下面的内容替换内部的IF:

if [[ -f "$file" && "$file" =~ ^.*/tag[0-3].txt$ ]]; then echo mv "$file" "${file/.txt/a.txt}" fi

首先检查结果是你所期望的,然后可能会删除mv命令前面的“echo”。

使用您的系统上可能rename的Perl脚本版本:

find . -name 'tag?.txt' -exec rename 's/.txt$/a$&/' {} ;

使用二进制可执行版本的rename :

find . -name 'tag?.txt' -exec rename .txt a.txt {} ;

这改变了“.txt”的第一次出现。 由于文件名受到-name参数的限制,这不会成为问题。

这足够好吗?

jcomeau@intrepid:/tmp$ find . -name tag?.txt ./a/tag0.txt ./b/tagb.txt ./c/tag1.txt ./c/d/tag3.txt jcomeau@intrepid:/tmp$ for txtfile in $(find . -name 'tag?.txt'); do mv $txtfile ${txtfile%%.txt}a.txt; done jcomeau@intrepid:/tmp$ find . -name tag*.txt ./a/tag0a.txt ./b/tagba.txt ./c/d/tag3a.txt ./c/tag1a.txt

实际上不要将反斜杠放到命令中,如果是这样,则在下一行中会出现“>”提示符。 为了避免混淆,我没有把它写入输出,但我不希望任何人滚动。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐