我必须将一些文件从一个文件夹移动到另一个文件夹,这是由 find 和 grep 设置的标准。当我尝试移动文件时,它会损坏。
它尝试的实际举动是mv /somefolder/export//somefolder/storage/testfileOLD.txt
我所期望的是mv /somefolder/storage/testfileOLD.txt /somefolder/export/testfileOLD.txt
我正在使用的命令:
find /somefolder/storage/ -type f -name "*OLD*" -newermt '2019-05-1' ! -newermt '2019-06-7' -exec grep -qiF 'closed' {} \; -exec mv {} /somefolder/export/{} \;
我已经尝试过-exec basename {}
,这给了我正确的结果,但是当我将 mv 修改为
-exec echo {} /somefolder/export/$(basename {}) \;
检查它是否有效,它仍然给我/somefolder/export//somefolder/storage/testfileOLD.txt
.
答案1
$(basename {})
将会失败(更好:只是一个空字符串)。此处调用的子 shell 不会扩展{}
为文件名,因为这是特定于查找的,不会导出到您的命令创建的子 shell 中。
您可以通过运行来测试这一点
find -exec echo "this will be empty:" $(basename '{}') \;
我建议你写一个小脚本:
#!/bin/bash
mv "$1" /somefolder/export/"$( basename ${1})"
并在您的命令中运行它find
:
find /dir/ <specs> -exec grep -qiF 'closed' '{}' \; -exec bash script.sh '{}' \;
AFAIK 转发到子 shell 的行为'{}'
取决于您的find
版本。
答案2
如果你想保留目录下的原始结构/somefolder/somedir
,你可以rsync
使用mv
.
测试设置:
/somefolder/storage/testfileOLD.txt
/somefolder/storage/subdir/fileOLD.txt
移动后的预期结果:
/somefolder/export/testfileOLD.txt
/somefolder/export/subdir/fileOLD.txt
命令:
# first, create a file list of relative paths (some arguments removed for simplicity)
$ find /somefolder/storage -type f -name "*OLD*" -printf '%P\n' > /tmp/filelist
# cat to illustrate its content
$ cat /tmp/filelist
subdir/fileOLD.txt
testfileOLD.txt
# then rsync using `--remove-source-files` to move the files
$ rsync -av --remove-source-files --files-from=/tmp/filelist /somefolder/storage /somefolder/export