我有一个目录,其中包含名称中带有空格的多个文件。我想在名称中找到一个模式,这些文件将被移动到其他目录。现在的问题是,当在单个文件名中找到特定模式时,该文件将移动到目标路径,但是当存在多个文件时,此方法将失败。以下是我正在使用的代码:
for file in `find . -maxdepth 1 -name "*$pattern*xlsx" -type f`
do
mv "$file" $destination/
done
答案 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/"