我已经广泛寻找该问题的答案但找不到解决方案:
到目前为止,我已经使用该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 的每一行并将其与cp
或mv
命令配对,以自动移动或复制使用命令定位的那些文件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
)。