Linux создавать символические ссылки на основе самых последних измененных файлов - PullRequest
0 голосов
/ 17 февраля 2012

Я хочу рекурсивно искать дерево каталогов и получать 10 самых последних измененных файлов. Для каждого из этих файлов я хочу создать символическую ссылку в моем каталоге /home/mostrecent/.

Я знаю, что могу решить эту проблему с помощью языка сценариев, но я немного раздражен, что не могу сделать это с помощью команды linux!

Пока у меня есть это:

find /home/myfiles -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort | tail -n 10 | cut -c 32-

Как создать символическую ссылку в /home/mostrecent для каждого из этих файлов без использования языка сценариев?

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

На самом деле, bash - это язык сценариев, более чем способный выполнять такие вещи даже из командной строки: -)

Предполагая, что команда, которую вы опубликовали, работает (и, похоже, основываясь на моем беглом тестировании), вы можете просто сделать:

i=0
for f in $(CMD) ; do
    ln -s $f $HOME/recent$i
    ((i++))
done

Или, как однострочный:

i=0;for f in $(CMD);do ln -s $f $HOME/recent$i;((i++));done

Это создаст файлы recent0 - recent9 в вашем домашнем каталоге, которые являются символическими ссылками на самые последние файлы.

Очевидно, вы должны поместить вашу фактическую команду туда, где я поместил маркерный текст CMD выше. Я использовал маркер только для того, чтобы он хорошо форматировался здесь, на SO.


Как отмечает Ян Худек в комментарии, это будет работать только для файлов без пробелов, на мой взгляд, злые вещи: -)

Но, поскольку люди, кажется, используют их, вы можете использовать более безопасный:

i=0
CMD | while read f; do
    ln -s $f $HOME/recent$i
    ((i++))
done

И, опять же, однострочная версия:

i=0;CMD|while read f;do ln -s $f $HOME/recent$i;((i++));done
0 голосов
/ 23 июля 2014

Создание символических ссылок на несколько типов файлов, измененных за последние 24 часа, с одинаковыми именами файлов (но, конечно, с другим путем)

Благодаря Пакс, Яну и Джону, с небольшой модификацией ...

Создать «недавний» каталог

mkdir ~/recent

Создайте 'getrecentfiles.sh' и добавьте ...

#!/usr/bin/bash
find $HOME -mtime 0 -name \*.txt -print -o \
           -mtime 0 -name \*.pdf -print -o \
           -mtime 0 -name \*.extensionname -print -o | while read f; do
        ln -s $f $HOME/recent/
done

фильтры:

-mtime (n * 24 часа) - время с момента последнего изменения (n = 1 показывает только измененные файлы 24-48 часов назад)

-o - оператор OR для нескольких файлов (по умолчанию - AND)

Измените его на исполняемый, добавьте его в свои сценарии запуска и создайте ярлык для ~ / недавнего на вашем рабочем столе, чтобы иметь под рукой последние файлы!

0 голосов
/ 18 февраля 2012

Я решил это с помощью sed.

Всем привет!

find /home/myfiles/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort | tail -n 10 | cut -c 21- | sed -e "s/^/ln -s \"/" -e "s/$/\"/" -e "s/$/ \"\/home\recent\/\"/" | sh

Если я труба sed до cat вместо sh, это вывод:

ln -s "/home/myfiles/1.simplest" "/home/recent/"
ln -s "/home/myfiles/2.with space" "/home/recent/"
ln -s "/home/myfiles/3.with'apostraphe" "/home/recent/"
ln -s "/home/myfiles/4.with'apostrophe space" "/home/recent/"

Спасибо за помощь.

...