如何在复制到unix目录时用空格替换filename中的下划线

时间:2017-10-27 07:09:00

标签: linux unix

我想将一个文件(在其名称中包含下划线)复制到我想用文件名中的空格替换下划线的目录。

 cp -pr myDir/myFile_With_Underscore.pdf my2Dir

我想在my2Dir中添加用空格替换下划线的文件名。

喜欢 myFile_With_Underscore.pdf 应该是my2Dir中的 myFile With Underscore.pdf

3 个答案:

答案 0 :(得分:1)

您可以使用tr命令(请参阅:man tr):

cp "/path/to/${source}" "/new/path/to/$(echo ${source} | tr '_' ' ')"

tr会将一组字符转换为另一组字符,从而用空格替换每个_

一个非常重要的注意事项:在包含空格时不要忘记引用复制参数。如果没有引号,每个单词都会被视为一个单独的字符。所以:

cp my_file my new file # NOT OK
cp my_file "my_new_file" # OK, as the parameter with spaces is quoted
cp "my_file" "my new file" # Also OK. Quotes on the first not neccessary, but dont hurt either

正如tr所做的那样,您也可以使用其他几个命令执行此操作,例如sedawk。例如,使用sed

cp "/path/to/${source}" "/new/path/to/$(echo ${source} | sed 's/\_/ /g')"

但我建议坚持tr这么简单的任务。

答案 1 :(得分:0)

您可以使用rename来更改当前目录中的所有PDF文件,执行

rename 'y/_/ /' *.pdf

在您的具体示例中执行:

cp -p myDir/myFile_With_Underscore.pdf my2Dir && rename 'y/_/ /' my2Dir/myFile_With_Underscore.pdf

答案 2 :(得分:0)

这样的事情:

for i in myDir/myFile_With_Underscore.pdf; do \
cp $i myDir2/${$(basename $i)//_/ }; done

如果您位于原始文件所在的同一目录中,则可以省略basename,例如:

for i in .myFile_With_Underscore.pdf; do cp $i ../myDir2/${i//_/ }; done

注意${i//_/ },为了操纵文件的名称,名称需要在变量$i中,因此使用for i in

${string//substring/replacement} $ substring 的所有匹配替换为 $ replacement