一、场景描述
在终端窗口中,用shell
命令,批量拷贝文件到指定目录。
我是在Windows
系统上,通过git bash
终端来执行shell
命令的。
二、实现过程
命令1
for filepath in `find /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版/ -name *无答案*`; do cp $filepath /c/Users/admin/Desktop/高中数学/基础版; done
结果:
于是把find
命令单独拿出来执行:
find /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版/ -name *无答案*
结果:
发现文件路径和文件名存在空格。
查找解决办法
复制时,如何处理带空格的文件路径或文件名。
查找结果:
使用单引号('')
或双引号("")
包裹文件名字。
命令2
for filepath in `find /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版/ -name *无答案*`; do echo "\"$filepath\"" /c/Users/admin/Desktop/高中数学/基础版; done
结果:
发现,文件路径还是被分割了。
而且,双引号也成功添加到每个切割的部分上了。说明,语句修改对的,但是,没达到预期效果。
这时候,我感觉,是在for
循环读取find
结果集时,就已经切割了。
但是,find
命令查询的结果是正常的,没有切割。
继续查找解决办法for
循环处理带空格的字符串。
查找结果∶
更改shell
分隔符即可
上图代码:
只需要更改 shell分隔符即可
在for循环之前修改IFS变量,示例:
OLDIFS="$IFS" #备份旧的IFS变量
IFS=$'\n' #修改分隔符为换行符
for i in `cat aaa` #aaa文件中存放着公钥
do
echo "$i"
done
IFS="$OLDIFS" #还原IFS变量
于是,成功解决问题。文章来源:https://www.toymoban.com/news/detail-815559.html
三、最终实现
admin@DESKTOP-0DH3J68 MINGW64 /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版
$ OLDIFS="$IFS"
admin@DESKTOP-0DH3J68 MINGW64 /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版
$ IFS=$'\n'
admin@DESKTOP-0DH3J68 MINGW64 /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版
$ for filepath in `find /d/LearningMaterials/数学/数学/高中/一数/偏基础(基础+中档版)/基础篇2.0电子版/ -name *无答案*`; do cp "$filepath" /c/Users/admin/Desktop/高中数学/基础版; done
所以,命令1
的问题的本质在于shell
分隔符是空格
导致的。而不是文件名中带有空格
导致的问题。因为,find
的结果是正常的。但是,经过for
循环之后,出了问题。文章来源地址https://www.toymoban.com/news/detail-815559.html
到了这里,关于Linux:使用for+find查找文件并cp到其他目录,文件名带有空格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!