为什么 `head` 不想给我 `find` 列表顶部的文件名?

为什么 `head` 不想给我 `find` 列表顶部的文件名?

我需要从一个目录中挑选最近播放最少的声音文件并将其放入另一个目录中。我试过:

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@ %p\n' | sort -n | head -n 1 -exec cp {} /home/carl/playout_rock_SE/ \;

我得到:

head: invalid option - - ’e’

答案1

这是一种避免heading 和seding 的替代方法(并且对于任何合法文件名也应该是安全的):

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@\t%p\0' |
  sort -znk1,1 | { read -r -d '' t f; cp -v -- "$f" "/home/carl/playout_rock_SE/" ; }

答案2

如果您使用管道,则管道之前的命令已完成。您无法在管道的另一侧使用 恢复find命令。该命令认为是一系列选项,但它没有 这样的选项,因此是“无效选项”-exechead-exec-e

如果您的文件名没有空格或其他奇怪的字符,您应该可以像这样管理:

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@ %p\n' | sort -n | head -n 1 | sed 's/.* //' | xargs -p -I '{}' cp -v -- '{}' /home/carl/playout_rock_SE/
  • sed 's/.* //'既然我们已经选出了文件,就删除时间戳(这将删除所有内容,包括第一个空格)
  • -pinteractive - 执行命令前确认
  • -I替换字符串-这样我们就可以将输入文件名放在目标之前,以提供cp正确的语法
  • cp -v --告诉我们正在复制什么,并将其后的任何内容视为参数,即使它看起来像一个选项

不过我建议使用steeldriver 的答案更可靠反而 ;)

相关内容