如何将找到的文件移动到另一个目录?

mic*_*nrs 5 command-line bash mv

大家好,除了 mv 参数外,我有以下脚本可以正常工作。该脚本基本上搜索在特定时间创建的文件,我需要将所有已建立的文件移动到另一个具有名称的目录timefile

脚本:

#!/bin/bash
read -rp 'hour ([0]0-23): ' hour
case $hour in
  (0|00)
    find /home/mikepnrs -newermt "yesterday 23:59" \
      ! -newermt 0:59 ;;
  (0[1-9]|1[0-9]|2[0-3])
    find /home/mikepnrs -newermt "$((10#$hour-1)):59" \
      ! -newermt "$hour:59" | mv -t /home/mikepnrs/timefile ;;
  (*)
    printf 'invalid hour: %s\n' "$hour"
esac
Run Code Online (Sandbox Code Playgroud)

语法mv -t /home/mikepnrs/timefile似乎不起作用。我得到的错误是 mv 缺少文件操作数。

任何解决方案?

pLu*_*umo 5

您的管道 ( find ... | mv ...) 表示将 STDOUT of 发送findmv. 但mv不接受来自 STDIN 的文件,只接受参数。

可以使用xargs以下方法将 STDIN 转换为参数:

find ... -print0 | xargs -0 mv -t target
Run Code Online (Sandbox Code Playgroud)

-print0xargs -0通过管道将空分隔而不是换行分隔输出,因为换行符是作为文件名一部分的有效字符)。

首选的选择是简单地使用find -exec

find ... -exec mv -t target {} +
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

find /home/mikepnrs -newermt "$((10#$hour-1)):59" \
  ! -newermt "$hour:59" -exec mv -t /home/mikepnrs/timefile {} +
Run Code Online (Sandbox Code Playgroud)

免责声明:我没有检查脚本的其余部分。

  • @pLumo 仍然需要`;;` 来终止`case` 我认为? (2认同)