我想将一个文件(在其名称中包含下划线)复制到我想用文件名中的空格替换下划线的目录。
cp -pr myDir/myFile_With_Underscore.pdf my2Dir
我想在my2Dir中添加用空格替换下划线的文件名。
喜欢 myFile_With_Underscore.pdf 应该是my2Dir中的 myFile With Underscore.pdf 。
答案 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
所做的那样,您也可以使用其他几个命令执行此操作,例如sed
或awk
。例如,使用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 。