Sugerencia usando GNUdate
:
yesterday=$( date -d yesterday +%F )
drop_dir=/tmp/drop
archive_dir=/tmp/arch
mkdir -p "$archive_dir"
mv -f "$drop_dir"/*"$yesterday"*.gz "$archive_dir"
Aquí, "$drop_dir"/*"$yesterday"*.gz
se expandirá a todos los archivos que coincidan con el patrón dado. Esto funcionará siempre que el patrón se expanda a varios miles de caracteres, en cuyo caso el shell se quejará con "Lista de argumentos demasiado larga".
O, si realmente desea hacer un bucle para generar cada nombre de archivo a medida que se mueven (solo el comando mv
de arriba se cambia a lo siguiente):
for name in "$drop_dir"/*"$yesterday"*.gz; do
[ -f "$name" ] || continue
mv "$name" "$archive_dir"
printf 'Moved "%s"\n' "$name"
done
Aquí, el ciclo for
iterará sobre los mismos nombres que se usaron en la variación anterior, pero uno por uno. Cada nombre se mantendrá en $name
(, que incluye el nombre del directorio ). Si no hubiera archivos que coincidieran con el patrón, el patrón permanecerá sin expandir. Es por eso que hacemos una prueba explícita para asegurarnos de que $name
realmente corresponda a un archivo existente antes de moverlo.
O, confind
:
find "$drop_dir" -maxdepth 1 -type f -name "*$yesterday*.gz" \
-print -exec mv {} "$archive_dir" ';'
Aquí, find
tomará los nombres de $drop_dir
que corresponden a los archivos normales(-type f
)y que coinciden con el patrón dado a -name
. Para cada uno de estos nombres, se llama mv
para mover el archivo a la carpeta de destino. Sin embargo, antes de llamar a mv
, -print
enumerará el nombre del archivo (, incluida la ruta )en la terminal.
La opción -maxdepth 1
evita que find
recurra a subcarpetas de $drop_dir
.
Использовать две команды awk
awk '{print $NF}' file |awk '{a+=$(NF-1)*60+$(NF);printf"%d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60}'
Первый awk извлекает поле las файла, а второй awk выполняет нужные вам действия.
это работает независимо от того, содержит ли файл только время или нет, если время является последним полем в строке
Это проблема, с которой вы сталкиваетесь :, когда FS=" :", ваше первое поле — "1. Track 01 05", и когда вы используете эту строку в арифметическом контексте, первое не -цифра усекает число, поэтому значение минут равно «1». Вам нужно использовать пробел или двоеточие в качестве разделителя полей, но тогда любой завершающий пробел означает, что у вас есть лишние пустые поля.
Я бы сделал
awk '
BEGIN {h = m = s = 0}
function add_time(min, sec) {
s += sec
m += min
while (s >= 60) {s -= 60; m++}
while (m >= 60) {m -= 60; h++}
}
{
split($NF, t, /:/)
add_time(t[1], t[2])
printf "%d:%02d:%02d\n", h, m, s
}
' file