УПП три новые файлы, используя Баш


Я пытаюсь найти три самых новых файла в каталоге. Прямо сейчас я использую ls -t | head -3, чтобы узнать их имена и просто записать их в команде scp, но это становится трудным. Я попробовал использовать ls -t | head -3 | scp *username*@*address*:*path*, но это не сработало. Как лучше всего это сделать?

4 4

4 ответа:

Возможно, самое простое решение, но оно не имеет дела с пробелами в именах файлов

scp `ls -t | head -3` user@server:.

Использование xargs имеет преимущество в работе с пробелами в именах файлов, но будет выполнять scp три раза

ls -t | head -3 | xargs -i scp {} user@server:.

Решение на основе цикла будет выглядеть следующим образом. Мы используем while read здесь, потому что по умолчанию разделителем для чтения является символ новой строки, а не пробел, как в цикле for

ls -t | head -3 | while read file ; do scp $file user@server ; done

К сожалению, идеальное решение, которое выполняет одну команду scp во время работы красиво с белым пространством, ускользает от меня в данный момент.

Напишите простой сценарий bash. Этот отправит последние три файла, если они являются файлом, а не каталогом.

#!/ bin / bash

DIR=`/bin/pwd`

for file in `ls -t ${DIR} | head -3`:
 do
  if [ -f ${file} ];
  then
    scp ${file} user@host:destinationDirectory
  fi
done

Попробуйте использовать этот скрипт для scp последних 3 файлов из предоставленного 1-го аргумента пути к этому скрипту:

#!/bin/bash

DIR="$1"

for f in $(ls -t `find ${DIR} -maxdepth 1 -type f` | head -3)
 do
    scp ${f} user@host:destinationDirectory
done

find -type f удостоверяется, что только файлы находятся в ${DIR} и head -3 занимает верхние 3 файла.

Это, вероятно, больше не имеет отношения к плакату, но вы привели меня к идее, которая, я думаю, является тем, что вы хотите:

tar cf - `ls -t | head -3` | ssh *username*@*server* tar xf - -C *path*