Я попробовал команду ниже, и она сработала нормально
for file in `find /home -type f | awk -F "/" '{print $NF}'`
do
for dir in `find. -type d| sed "s/\.//g"| sed 's/$/\//g'`
do
sudo find $dir -type f -iname $file | awk '{print "ls -ltrh" " " $0}'
done | sh | sed -n '$p'
done | awk '{print "cp -rvfp" " " $NF " " "/destinationlocationtocopy/"}' | sh
Если вы нажимаете клавишу ENTER по крайней мере один раз в день, то решение на основе PROMPT _COMMAND -может сработать для вас:
save_history_daily () {
# if the current time is more than a day's-worth of seconds newer than
# the modification time of $HISTFILE, then run 'history -a'
if (( $(printf '%(%s)T' -1) - 86400 > $(stat -c %Y "$HISTFILE") ))
then
history -a
fi
}
PROMPT_COMMAND="$PROMPT_COMMAND
save_history_daily"
Это зависит от версии bash bash -4.2 -alpha или новее для функции printf %(...)T
; здесь я использую аргумент -1
для получения текущего времени в секундах -с -эпохи -. Если у вас более старая версия bash, вы можете заменить этот бит вызовомdate
:$(date +%s)
. В версиях Bash, начиная с bash -5.0 -alpha, доступна переменная EPOCHSECONDS, которая была бы несколько более эффективной.
Я скопировал встроенную -новую строку PROMPT _идею назначения COMMAND из одного из ответов Жиля ; он добавляет новый вызов функции к любому существующему значению (s ), которое уже было определено.
Прежде всего, history
— это Bash, встроенный -в команду, и он влияет на сеанс, который он запускает. Насколько я знаю, вы не можете запустить команду истории из другого сеанса, чтобы сохранить последние команды, которые еще не были сохранены.
Одним из решений может быть изменение переменной окружения PROMPT_COMMAND
для запуска history -a
при каждом вводе команды. Этот пост может вам помочь.
Вы не можете сохранить историю оболочек из скрипта. Во всяком случае, не напрямую.
Это в основном непроверенная идея.
Оболочка bash
игнорирует сигнал QUIT
как интерактивная оболочка, так и не интерактивная оболочка -.
Это означает, что может быть установлена ловушка для перехвата сигнала QUIT
. Это можно сделать из файла запуска оболочки для интерактивных сеансов оболочки, то есть в ~/.bashrc
. Ловушка просто вызоветhistory -a
:
trap 'history -a' QUIT
Затем сигнал QUIT
может быть отправлен в сеанс оболочки, чтобы он сохранил свою историю. Используя pkill
, вы даже можете отправить его на всеbash
сеансы, которые вы сейчас запускаете :
pkill -QUIT -U "$LOGNAME" bash
Это можно сделать из задания cron.
Обратите внимание, что я на самом деле не проверял это в какой-либо степени, кроме как убедиться, что это выглядит как работающее. Единственная мелочь заключается в том, что ^\
появляется в приглашении в оболочках, которые получают сигнал таким образом. Я также просто предполагаю , что если множество оболочек сохранят свою историю одновременно ,затем это делается разумно, чтобы избежать смешанных записей.
Лично я, вероятно, использовал бы history -a
в PROMPT_COMMAND
вместо:
PROMPT_COMMAND+="${PROMPT_COMMAND:+;}history -a"
или
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}history -a"
(Они добавляют history -a
к значению PROMPT_COMMAND
и ограничивают его с помощью ;
, если переменная уже имеет не -пустое значение.)
Это позволит сохранить историю непосредственно перед отображением следующей подсказки. Вероятно, не будет какого-либо заметного снижения производительности при выполнении этого при каждом запросе.