移动名称中包含空格的多个文件(Linux)

时间:2013-12-26 08:57:12

标签: linux shell find move

我有一个目录,其中包含名称中带有空格的多个文件。我想在名称中找到一个模式,这些文件将被移动到其他目录。现在的问题是,当在单个文件名中找到特定模式时,该文件将移动到目标路径,但是当存在多个文件时,此方法将失败。以下是我正在使用的代码:

for file in `find . -maxdepth 1 -name "*$pattern*xlsx" -type f`
do
 mv "$file" $destination/
done

3 个答案:

答案 0 :(得分:4)

无需使用循环:

find . -maxdepth 1 -name "*$pattern*xlsx" -type f -exec mv {} $destination +

答案 1 :(得分:1)

有时候,插入循环主体的逻辑可能足够复杂,以至于无法保证真正的bash循环。

这是一种可行的解决方案:

find . -maxdepth 1 -name "*$pattern*xlsx" -type f | while IFS= read -r file
do
   mv "$file" $destination/
done

编辑:对于IFS=表示@ -r表示敬意,以处理带有开头和结尾空格的文件名,对-print0表示敬意,以处理带有转义的退格字符的文件名。

已知限制:此解决方案不适用于嵌入了换行符的文件名。对于这种情况,请参阅此问题的其他答案。

@Charles Duffy对Moving files with whitespace的注释中的解决方案即使在文件名中使用换行符也有效:

  • find命令中添加-d ''以终止具有NULL字符的记录
  • read命令中添加find . -maxdepth 1 -name "*$pattern*xlsx" -type f -print0 | while IFS= read -r -d '' file do mv "$file" $destination/ done 以读取以NULL结尾的记录
text

答案 2 :(得分:0)

使用以下代码正常工作

find . -maxdepth 1 -name "*$pattern*xlsx" -type f -print0 | xargs -I{} -0 mv {} "$destination/"