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

4ktjp1zp  于 2023-03-01  发布在  Linux
关注(0)|答案(4)|浏览(149)

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

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

z9smfwbn1#

无需使用循环:

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

kh212irz2#

使用以下代码可以正常工作

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

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的解决方案,即使文件名中有换行符,也会起作用:

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

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/ {} +

相关问题