Linux 递归地用下划线替换所有目录的句点和除最后一个句点之外的所有文件
Linux recursively replace periods for all directorys and all but last period for files with underscores
我有以下命令递归地将所有 files/directory 重命名为小写并用 _ 替换空格。
find . -iname "*" | rename 'y/A-Z/a-z/; s/ /_/g;'
如何扩展它以从目录中删除所有句点并只为文件保留最后一个句点?
所以输入是:
this.is.a.directory
this.is.a.file.txt
输出
this_is_a_directory
this_is_a_file.txt
您可以在 while 循环中使用 find
并使用正则表达式为文件保留最后 DOT
来执行此操作:
while IFS= read -rd '' entry; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
rename 'y/A-Z/a-z/; s/ /_/g; s/\./_/g' "$entry"
else
rename 'y/A-Z/a-z/; s/ /_/g; s/\.(?=.*\.)/_/g' "$entry"
fi
done < <(find . -iname '*' -print0)
s/\.(?=.*\.)/_/g
只有在输入中前面有另一个点时才会替换一个点。
我有以下命令递归地将所有 files/directory 重命名为小写并用 _ 替换空格。
find . -iname "*" | rename 'y/A-Z/a-z/; s/ /_/g;'
如何扩展它以从目录中删除所有句点并只为文件保留最后一个句点?
所以输入是: this.is.a.directory this.is.a.file.txt
输出 this_is_a_directory this_is_a_file.txt
您可以在 while 循环中使用 find
并使用正则表达式为文件保留最后 DOT
来执行此操作:
while IFS= read -rd '' entry; do
entry="${entry#./}" # strip ./
if [[ -d $entry ]]; then
rename 'y/A-Z/a-z/; s/ /_/g; s/\./_/g' "$entry"
else
rename 'y/A-Z/a-z/; s/ /_/g; s/\.(?=.*\.)/_/g' "$entry"
fi
done < <(find . -iname '*' -print0)
s/\.(?=.*\.)/_/g
只有在输入中前面有另一个点时才会替换一个点。