Я часто ловлю себя на том, что пытаюсь заархивировать измененные файлы в моем рабочем каталоге --либо для того, чтобы скопировать все измененные файлы в другой рабочий каталог песочницы, либо для того, чтобы сохранить их на короткое время, потому что я хочу отменить некоторые изменения.
В этом случае я копирую список измененных файлов во временный файл и использую zip
с опцией -@
.
Допустим, я изменил файлы Foo.h, Bar.cc и TestBar.cc.
Допустим, я создаю файл с именем модифицированный -files.txt, содержимое которого:
Foo.h
Bar.cc
TestBar.cc
Я выполняю следующую команду, чтобы заархивировать эти файлы:
cat modified-files.txt | zip modified-files.zip -@
Обратите внимание, что следующий фрагмент кода НЕ работает с именами файлов, содержащими пробелы, символы табуляции или символы новой строки.
Чтобы узнать больше об используемой здесь команде find
-, см.https://unix.stackexchange.com/a/240424/364705
#!/bin/bash
lastrun=''
while true; do
read -r newer older <<< \
$(find. -type f -exec stat -c '%Y %n' {} \; \
| sort -nr \
| awk 'NR==1,NR==2 {print $2}'\
| xargs )
if [ "$newer" == "$lastrun" ]; then
:
else
if ! cmp "$newer" "$older" > /dev/null ; then
base64 "$newer"| tr -d '\n' | sed '$ a \'
lastrun="$newer"
fi
fi
done
И решение с использованиемinotify-wait
:
#!/bin/bash
lastfile=''
inotifywait -m /path/to/somewhere -e close -e moved_to |
while read path action file; do
if [ "$lastfile" != '' ];then
if ! cmp "${path}$file" "${path}${lastfile}" > /dev/null ; then
base64 "${path}${file}"
fi
fi
lastfile="$file"
done