我使用以下命令来获取目录中的最新文件
/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
使用zsh
shell,假设您要复制目录中最近修改的文件/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
匹配/
。