我有一个目录,其中包含多个名称中有空格的文件。我想在名称中找到一个模式,然后这些文件将被移动到其他目录。现在的问题是,当在单个文件名中找到特定模式时,该文件将移动到目标路径,但当存在多个文件时,此方法失败。下面是我使用的代码:
for file in `find . -maxdepth 1 -name "*$pattern*xlsx" -type f` do mv "$file" $destination/ done
z9smfwbn1#
无需使用循环:
find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv {} $destination +
kh212irz2#
使用以下代码可以正常工作
find . -maxdepth 1 -name "*$pattern*xlsx" -type f -print0 | xargs -I{} -0 mv {} "$destination/"
vsaztqbk3#
有时,插入循环体的逻辑可能非常复杂,需要一个实际的bash循环。下面是一个解决方案:
find . -maxdepth 1 -name "*$pattern*xlsx" -type f | while IFS= read -r file do mv "$file" $destination/ done
编辑:IFS=和-r分别处理带有前导和尾随空格的文件名和带有转义退格符的文件名。已知局限性:这个解决方案不适用于嵌入了换行符的文件名。2对于这种情况,请参考这个问题的其他答案。从注解中的@Charles Duffy到Moving files with whitespace的解决方案,即使文件名中有换行符,也会起作用:
IFS=
-r
-print0
find
-d ''
read
find . -maxdepth 1 -name "*$pattern*xlsx" -type f -print0 | while IFS= read -r -d '' file do mv "$file" $destination/ done
xqkwcwgp4#
最上面的答案find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv {} $destination +对我不起作用,find -exec command {} +的手册页声明如下:命令中允许有一个“{}”示例,并且它必须出现在末尾,紧挨"+“之前所以我提议:find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv -t ../All\ Exercises/ {} +
find -exec command {} +
find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv -t ../All\ Exercises/ {} +
4条答案
按热度按时间z9smfwbn1#
无需使用循环:
kh212irz2#
使用以下代码可以正常工作
vsaztqbk3#
有时,插入循环体的逻辑可能非常复杂,需要一个实际的bash循环。
下面是一个解决方案:
编辑:
IFS=
和-r
分别处理带有前导和尾随空格的文件名和带有转义退格符的文件名。已知局限性:这个解决方案不适用于嵌入了换行符的文件名。2对于这种情况,请参考这个问题的其他答案。
从注解中的@Charles Duffy到Moving files with whitespace的解决方案,即使文件名中有换行符,也会起作用:
-print0
添加到find
命令中,以使用NULL字符终止记录-d ''
添加到read
命令以读取以NULL结尾的记录xqkwcwgp4#
最上面的答案
find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv {} $destination +
对我不起作用,find -exec command {} +
的手册页声明如下:命令中允许有一个“{}”示例,并且它必须出现在末尾,紧挨"+“之前
所以我提议:
find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv -t ../All\ Exercises/ {} +