Привет всем У меня есть следующий скрипт, который отлично работает, кроме аргумента 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
Синтаксис mv - t / home / mikepnrs / timefile
, похоже, не работает. Я получаю сообщение об ошибке: отсутствует файл операнда.
Какие-либо решения?
Ваш канал ( find ... | mv ...
) означает отправку STDOUT найти
для STDIN mv
. Но mv
не принимает файлы из STDIN, только аргументы.
Вы могли бы переводить STDIN в аргументы, используя xargs
:
find ... -print0 | xargs -0 mv -t target
( - print0
и xargs -0
направить с нулевым разделителем вместо вывода с новой строкой, потому что символ новой строки является допустимым символом как часть имен файлов).
Но предпочтительная опция это просто использовать find -exec
:
find ... -exec mv -t target {} +
В вашем случае:
find /home/mikepnrs -newermt "$((10#$hour-1)):59" \
! -newermt "$hour:59" -exec mv -t /home/mikepnrs/timefile {} +
Отказ от ответственности: Я не проверял остальную часть вашего скрипта.