Am Fri, Dec 09, 2022 at 01:13:50PM +0000 schrieb Michael: > > > I get the impression Dale isn't actually PLANNING his disk storage. It's > > > just a case of "help I'm downloading all this stuff where do I put it!!!" > > > > Haha, thanks for the laugh. > > Actually this had me thinking what is the need to back up the ... Internet? > […] > > I appreciate some of these video files may be rare finds, or there may be a > risk some of these may be taken off the interwebs sooner or later. This > should leave a rather small subset of all downloads, which may merit a local > backup, just in case. I'd thought the availability of higher fiber download > speeds negates the need for local backups, of readily downloadable media.
Good points. I am a big fan of having stuff locally as well, because I don’t want to be dependent on a company’s servers and a working Internet connection. But this mostly applies to my mobile device, because I don’t have a data plan for mobile Internet. > > Well, ts uses mpeg2 encoding, just like old video DVDs, which is very > > inefficient when compared with modern h264/h265. Modern digital TV broadcast > > uses h264 by now. > > Depending on the PVR make/model I've seen 1080p resolution recordings with > .m2ts and .ts file extensions, while the codecs inside them are the same. I wasn’t aware that ts could contain h264. But then again—I never really bothered with live TV recordings in recent years. These days, if I find something interesting, I download the show form the TV channel’s website (called Mediathek in Germany, a word play on Bibliothek, meaning library). Interestingly though, the picture quality is noticably worse than what I receive via DVB-T. > > ¹ I do have several external USB disks, plus the big NAS. All of which don’t > > run very often. And I don’t want to turn them on just to look for a certain > > file. That’s why I have another little script. ;-) It uses the `tree` > > command to save the complete content listing of a directory into a text > > file and names the file automatically by the name of the directory it > > crawls. So if I want to find a file, I just need to grep through my text > > files. > > Backup scripts utilising rsync, tar, etc. can output a log file which contains > (some) details of all the backed up files. Nothing as sophisticated as > Frank's script, but it allows for a quick search against the name of the file > or directory, before extraction. Naturally, I just discovered two bugs in the script while I was re-reading my mail. One of them broke the creation of the symlink which points to the most recent version of a script output. The other prevented normal operation if only gzip was available amongst the used compressors. -- Grüße | Greetings | Salut | Qapla’ Please do not share anything from, with or about me on any social network. We promise nothing, but that we keep.
#!/usr/bin/env bash # history # 2018-02-10 initial version # 2020-06-10 added -a option # ????-??-?? gzip result # 2021-03-22 put current date into output filename # 2021-04-06 code refactoring with more functions and input sanitisation # 2021-12-22 prefer zstd over gzip # 2022-01-23 don't create symlink if there is no previous file # 2022-01-30 added xz to compressors # 2022-12-08 some cleanup, added -C and -K options # 2022-12-09 bug fixes die() { echo "${@}" > /dev/stderr exit 1 } usage() { cat <<-EOF Usage: $(basename "$0") [-o NAME] [DIR] A wrapper to tree, it writes the content of DIR into a text file. The file is named after DIR and the current date, and symlink to the most recent version is set. The file is automatically compressed to zstd, xz or gzip, whichever is available in that order. Options: -a access attributes: owner, group, permissions -C do not compress result file -K do not keep backup of existing file in case of overwriting -o The destination where to write the trees. Default: . If it is a directory: write in there If it is a filename: use that as base. If not, use the name of the directory as name base. EOF } test_writable() { touch "$1" 2>/dev/null || die "Cannot create file in $(dirname "$1")." } # run tree and redirect output to destination file call_to_tree() { WHICH="$1" OUTPATH="$2-$1" shift 2 declare TREE_ARGS TREE_ARGS+=("$@") TREE_ARGS+=("-o") TREE_ARGS+=("$DATED_PATH") local DATED_PATH="$OUTPATH-$TODAY" local EXT local PACK local CREATE_SYMLINK=no if [ "$COMPRESS" = "no" ]; then 0 elif command -v zstd > /dev/null; then PACK="zstd --rm -q -13" EXT=".zst" elif command -v xz > /dev/null; then PACK="xz" EXT=".xz" else PACK="gzip" EXT=".gz" fi ls "$OUTPATH-"* > /dev/null 2>&1 && CREATE_SYMLINK=yes # pack yet unpacked file if [ "$COMPRESS" != "no" ]; then [ -f "$DATED_PATH" ] && [ ! -f "$DATED_PATH$EXT" ] && $PACK "$DATED_PATH" fi # move away old file if [ -f "$DATED_PATH$EXT" ]; then [ "$KEEP_OLD" = "no" ] && rm -f "$DATED_PATH$EXT" || mv -f "$DATED_PATH$EXT" "$DATED_PATH.old$EXT" fi test_writable "$DATED_PATH" echo "Writing $WHICH tree to $(realpath "$DATED_PATH")$EXT" BEGIN_TIME=$(date +%s) "${TREE_ARGS[@]}" END_TIME=$(date +%s) echo >> "$DATED_PATH" df -BM . | awk 'NR==2 { print "Size: " $3 " Available: " $4 " Usage: " $5; }' >> "$DATED_PATH" [ "$PACK" ] && $PACK "$DATED_PATH" if [ "$CREATE_SYMLINK" = yes ]; then if [ -e "$OUTPATH" ] && [ ! -L "$OUTPATH" ]; then echo "Cannot set symlink, filename already taken." else echo "Setting symlink $OUTPATH -> $(basename "$DATED_PATH")" ln -sfn "$(basename "$DATED_PATH$EXT")" "$OUTPATH$EXT" fi fi echo "Reading of directory took $((END_TIME - BEGIN_TIME)) seconds." } # parse arguments unset ACCESSRIGHTS unset COMPRESS unset KEEP_OLD while getopts "CKaho:" OPTION do case $OPTION in C) COMPRESS=no ;; K) KEEP_OLD=no ;; a) ACCESSRIGHTS=yes ;; h) usage; exit 0 ;; o) OUTARG="$OPTARG" ;; esac done shift $((OPTIND-1)); OPTIND=1 # input sanitisation and derivation of destination paths DIR="${1:-$(pwd)}" [ -d "$DIR" ] || die "The given directory does not exist." [ "$OUTARG" ] && OUTARG="$(realpath "$OUTARG")" || OUTARG="$(pwd)" if [ -d "$OUTARG" ]; then OUTDIR="$OUTARG" OUTNAME="$(basename "$(realpath "$DIR")")" # realpath to catch `videotree .` [ "$OUTNAME" = "/" ] && OUTNAME=root else OUTDIR="$(dirname "$OUTARG")" OUTNAME="$(basename "$OUTARG")" fi TODAY="$(date +%F)" cd "$DIR" # write a very verbose file with permission and owner information call_to_tree "detailed" "$OUTDIR/$OUTNAME" tree -af -DFins --dirsfirst --du --timefmt "%Y-%m-%d %T" ${ACCESSRIGHTS:+-pug} # write a smaller version with only file size information #call_to_tree "simple" "$OUTDIR/$OUTNAME-tree" tree -ax -n --du -h --dirsfirst echo "Done."
signature.asc
Description: PGP signature