2011-04-02 2 views
4

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

ответ

6

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

scp `ls -t | head -3` [email protected]:. 

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

ls -t | head -3 | xargs -i scp {} [email protected]:. 

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

ls -t | head -3 | while read file ; do scp $file [email protected] ; done 

saddly, идеальное решение, один, который выполняет одну команду Scp во время работы хорошо с белым пространством, ускользает от меня в данный момент.

+0

Как и в другом ответе, он также отправит только 1 файл, если первые 2 записи НЕ являются файлами. – anubhava

+0

Я не верю, что плакат когда-либо указывал в его требованиях, что ему нужно иметь дело с каталогами. Фактически то, что он делал, подразумевает, что он этого не делает. – ltc

+0

интересное использование опции -i/{} xarg. Это приведет только к 1 вызову scp, а не к 3 вызовам, которые мы ожидаем от решения на основе цикла? – shellter

1

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

#!/Bin/Баш

DIR=`/bin/pwd` 

for file in `ls -t ${DIR} | head -3`: 
do 
    if [ -f ${file} ]; 
    then 
    scp ${file} [email protected]:destinationDirectory 
    fi 
done 
+0

Он будет посылать только 1 файл, если первые 2 записей из НЕ файлов , – anubhava

+0

это правильно, я упомянул, что он будет отправлять файлы только. – grantk

1

Попробуйте этот сценарий ПКПП последние 3 файла из прилагаемого пути первого аргумента для этого сценария:

#!/bin/bash 

DIR="$1" 

for f in $(ls -t `find ${DIR} -maxdepth 1 -type f` | head -3) 
do 
    scp ${f} [email protected]:destinationDirectory 
done 

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

+0

Это решение не удастся, если в имени файла есть пробел. Вы должны использовать чтение. – ltc

1

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

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

Это умное использование смолы. Я должен буду попробовать это в следующий раз, когда мне понадобится использовать эту команду. Спасибо за сообщение! –