使用 exec 查找和复制不起作用

使用 exec 查找和复制不起作用

我使用以下命令来获取目录中的最新文件

/usr/bin/find /home/user1/folder1/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | cut -f5 -d"/"

这仅返回文件名而不是整个路径。

然后我想将找到的文件复制到另一个文件夹中,因此我将以下内容附加到之前的 find 命令中:

 -exec cp {} /home/user2/folder2 \;

所以完整的命令如下所示:

 /usr/bin/find /home/user1/folder1/ -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" " | cut -f5 -d"/ -exec cp {} /home/user2/folder2 \;

但这返回

cut: invalid option -- 'e'

我在这里做错了什么?

答案1

您的命令似乎有两个问题,第一个问题对于您的情况可能并不重要,但仍然值得指出:(我)它不是通用的,因为它无法处理任意文件名,特别是包含换行符(即\n)的文件名,并且(二)正如 Kusalananda 已经指出的那样,该-exec选项属于find命令,因此不能像您尝试的那样与其分开。

使用 GNU 实用程序,可以通过以下管道修复这些问题,该管道将在目录中(或下面)找到最新的文件/home/user1/folder1/并将其复制到/home/user2/folder2/

find /home/user1/folder1/ -type f -printf '%T@ %p\0' 2>/dev/null |
sort -znk1,1 | tail -zn1 | cut -zf2- -d' '                       |
xargs -0 cp -t /home/user2/folder2/

至于问题(我):注意格式字符串\0末尾的-printf,以及管道中各种命令的-z和选项,它们确保识别的文件名以 NUL 分隔的方式传递,从而使其能够包含空格和/或换行符。-0

至于问题(二):您可以使用该xargs命令从中收集参数stdin并使用它们构建新的命令行。这里的部分技巧是使用命令-t的选项cp,在提供要复制到那里的任何文件名之前指定目标目录,因为xargs将通过以下方式构建命令行追加stdin它收到的给定命令的任何参数。

答案2

使用zshshell,假设您要复制目录中最近修改的文件/home/user1/folder1

cp /home/user1/folder1/*(.om[1]) /home/user2/folder2

如果zsh不是您的交互式 shell,那么您可以这样做

zsh -c 'cp /home/user1/folder1/*(.om[1]) /home/user2/folder2'

该模式/home/user1/folder1/*(.om[1])将扩展到给定目录中最近修改的常规文件的名称。*(.om[1])最后的内容是按修改时间 ( ) 对o常规文件 ( ) 进行排序 ( ) 并选择第一个 ( )。.m[1]

如果您需要匹配隐藏文件名,请使用

zsh -c -4 'cp /home/user1/folder1/*(.om[1]) /home/user2/folder2'

(添加-4

您是否需要另外查看子目录,请使用

zsh -c -4 'cp /home/user1/folder1/**/*(.om[1]) /home/user2/folder2'

shell 通配模式**在路径名中zsh匹配/

相关内容