Answers:
一个简单的1-liner应该可以做(假设Posix sh
兼容的shell):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
说明:
for ... in ...; do ...; done
是一个循环
*:*
匹配当前目录:
中名称相同的所有文件和目录
f
在循环中依次分配给每个这样的文件名
mv
将其第一个参数重命名为第二个;-v
(详细)要求它打印其功能;此选项特定于GNU-utils,因此在Linux上可用,但在Solaris上不可用
$(...)
在子外壳中执行代码并替换输出
echo
将其参数输出到标准输出
tr
读取标准输出并根据提供的地图翻译字符
如果您使用的是bash,则可以通过替换为来避免产生$()
带有子进程(tr
)的额外shell()。$(...)
${f//:/-}
我确信UNIX专业人士可以使用bash做到这一点,但这是我使用ruby的快速而肮脏的版本。
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
将path_to_files设置为您的错误命名文件的路径。将以上代码保存在名为rename.rb的文件中,然后:
username@machinename$ ruby rename.rb
如果只有一个或几个文件,则可以为您重命名:
p="201*"
。old_name=$(ls | grep $p)
。存储新文件名并替换必要的字符:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
奖金清理:
一。如果为了统一起见,您想将破折号(-
)和冒号(:
)替换为下划线(_
),则可以执行以下操作:
new_name=$(ls | grep $p | tr ':-' '_');
b。如果您也希望最后一个下划线(恰好在之前.txt
),请将new_name
变量设置为:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
注意:mv
如果重命名操作中包含任何文件名,它将失败spaces
。在这种情况下,请将适当的变量用引号引起来,例如:mv "$old_name" $new_name
OR mv $old_name "$new_name"
OR mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
使用重命名器:
$ renamer --find ":" --replace "-" *
rename
是在许多Linux发行版中预安装的工具。但是我认为对于Windows,此工具可能很棒。
这可能是多余的,但是您可以在此答案提供的链接中使用脚本重命名任何特殊字符:
for f in
... ...循环是一个循环遍历当前目录中需要匹配文件的所有文件的循环*:*
。(匹配的dirs会发生什么?)。move命令是一个移动旧名称新名称,其中通过使用shell执行新名称$( subshell here )
。tr会做什么,...