2009-11-03 2 views
4

У меня есть две папки, для аргументов sake/Volumes/A и/Volumes/B. Они монтируются сетевыми ресурсами с сервера Windows, содержащего загрузку файлов .bkf из Backup Exec.Bash Script, чтобы найти последний измененный файл

Я ищу сценарий, который рассмотрит обе папки и найдет последний измененный файл .bkf и скопирует его в другое место. В папках есть другие файлы, которые необходимо игнорировать.

Спасибо заранее!

Shaun

Edit:

Я постучала это вместе:

cp ls -alt /Volumes/E /Volumes/F| grep bkf | head -n 1 | awk '{print $8}' /Volumes/$xservedisk/Windows/ 

Можно ли думать о каких-либо причин, почему я не должен его использовать?

Еще раз спасибо Shaun

ответ

3
NEWEST= 
for f in /Volumes/A/*.bkf /Volumes/B/*.bkf 
do 
    if [ -z "$NEWEST" ] 
    then 
     NEWEST=$f 
    elif [ "$f" -nt "$NEWEST" ] 
    then 
     NEWEST=$f 
    fi 
done 
+0

Или свернуть все тело '[-n«$ NEWEST "] && [" $ NEWEST "-nt" $ f "] || NEWEST = $ f', но я полагаю, что это личный вкус. – ephemient

+0

Это было решение, которое работало лучше всего, поскольку мне нужен полный путь к файлу. Спасибо Douglas! –

2

Поиск файлов осуществляется с помощью: find /Volumes/[AB] -name '*.bkf'

Сортировка файлов по времени модификации осуществляется с: ls -t

если нагрузка файлов не так много , вы можете просто использовать:

ls -lrt `find /Volumes/[AB] -name '*.bkf'` 

Последний отображаемый файл является последним измененным.

редактировать

Более надежное решение (спасибо ephemient) является:

find /Volumes/[AB] -type f -name '*.bkf' -print0 | xargs -0 ls -lrt 
+2

Не удается найти имена, содержащие пробелы или другие нечетные символы. – ephemient

+0

Вот почему я поддержал ваш ответ. Моей может быть достаточно для большинства пользователей старой школы. – mouviciel

+0

Ну, вы можете решить проблему с помощью 'find -print0 | xargs -0 ls -ldrt' ('-d' в случае, если какой-то идиот сделал каталог с именем' * .bkf'), но это все еще оставляет проблему разбора ... – ephemient

2

идет через несколько поворотов, просто чтобы убедиться обрабатывать имена файлов с нечетными символами так, что mouviciel нам не делает:

NEWEST=$(find /Volumes/A /Volumes/B -name '*.bkf' -printf '%[email protected] %p\0' | \ 
    sort -rnz | xargs -0n1 2>/dev/null | head -n1 | cut -d' ' -f2-) 
[[ -n "$NEWEST" ]] && cp -v "$NEWEST" /other-location 

Фактически, поскольку эти файлы поступают из Windows и, таким образом, в значительной степени гарантированно не имеют нечетного символа актеры в их именах (например, встроенные строки),

NEWEST=$(find /Volumes/A /Volumes/B -name '*.bkf' -printf '%[email protected] %p\n' | \ 
    sort -rn | head -n1 | cut -d' ' -f2-) 
[[ -n "$NEWEST" ]] && cp -v "$NEWEST" /other-location 
+0

Почему вы решили использовать нулевое завершение? – Xailor

+0

Имена файлов, содержащие внедренные новые строки, в противном случае будут искажать 'sort'. Конечно, если бы найденный ведущий файл получил встроенную новую строку, 'head' тоже не поступил бы правильно. – ephemient

+0

Спасибо за отличные ответы, после открытия этого вопроса я создал это, что-то не так с этим: cp 'ls -alt/Объемы/E/Объемы/F | grep bkf | head -n 1 | awk '{print $ 8}' '/ Volumes/$ xservedisk/Windows/ Еще раз спасибо –

1
cp `find /Volumes/[AB] -name '*bkf' -type f -printf "%[email protected]\t%p\n" |sort -nr |head -1 |cut -f2` dst_directory/ 
+1

Хорошо, но вы должны сортировать время модификации вместо времени доступа, и оно терпит неудачу, если имена путей содержат пробелы (вы почти правы, хотя), а 'cp' не работает только с одним аргументом. – ephemient

+0

А я вижу, что вы уже исправили последний бит. – ephemient

+0

В монтировании NFS, конечно, доступ может быть ограничен, но, безусловно, следует учитывать другие моменты. Да, cp была моей ошибкой ввода, отредактирована. Имена файлов могут иметь пробелы? j/k Двойные кавычки должны исправить это. – Xailor

5

Я предпочитаю это для поиска наиболее недавно измененный файл:

find . -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort 
+0

Это недостаток рекурсивности. – Plasma

 Смежные вопросы

  • Нет связанных вопросов^_^