如何将带有空格的目录发送给另一个命令?

如何将带有空格的目录发送给另一个命令?

我已经广泛寻找该问题的答案但找不到解决方案:

到目前为止,我已经使用该find命令来定位标题中带有关键字的所有文件并将此列表传递给文件。

find ./ -name "*keyword*" > filepath.txt 很简单。

问题如下。假设命令找到三个文件:

/Documents/somefolder/keyword file 1.txt
/Documents/some other folder/keyword2.txt 
/Documents/a third folder/keyword file 3.txt

结果返回名称中带有空格的目录和文件。我正在尝试编写一个简单的 bash 脚本,它将获取 filepath.txt 的每一行并将其与cpmv命令配对,以自动移动或复制使用命令定位的那些文件find。问题是 bash 不会逐字解释文件路径,并将返回“没有这样的文件或目录”。我尝试复制一个读取文件中单词的脚本,如下所示,但它不起作用:

#!/bin/bash
for path in $(tr -d \; < filepath.txt); do
     mv $path ~/home/Documents/Newfolder
done

我的结果中有数百个文件,查找它们并重命名根本不可行。

答案1

你已经陷入bash 陷阱 #1

您可以使用循环可靠地完成您想要的操作while,如下所示:

while IFS= read -r path; do
  cp -n -- "$path" ~/home/Documents/Newfolder/
done < filepath.txt

注意目标目录尾部的斜杠 - 如果目录不存在,这可以防止发生意外 - 并-n防止覆盖同名文件。

您还可以考虑使用xargs换行符作为分隔符:

xargs -d '\n' cp -nt ~/home/Documents/Newfolder/ < filepath.txt

这里我使用 GNU-t形式的mv命令为多个文件指定单个目标目录。

find或者,您可以通过省略中间文件来省去所有麻烦,并使用-exec或操作移动或复制文件-execdir

find ./ -name "*keyword*" -exec cp -nt ~/home/Documents/Newfolder/ {} + 

我保留了你的路径~/home/Documents/Newfolder/,尽管我怀疑这是否是你真正想要的(它会扩展到/home/username/home/Documents/Newfolder)。

相关内容