From 2000c502d8ab24bf9da58648f7480ef44884779d Mon Sep 17 00:00:00 2001 From: heck Date: Fri, 26 Aug 2022 22:04:02 +0200 Subject: [PATCH] Add useful scripts --- scripts/cp_keep.sh | 67 +++++++++++++++++++++++++++++ scripts/renamer.pl | 104 +++++++++++++++++++++++++++++++++++++++++++++ scripts/unixify.sh | 60 ++++++++++++++++++++++++++ 3 files changed, 231 insertions(+) create mode 100755 scripts/cp_keep.sh create mode 100755 scripts/renamer.pl create mode 100755 scripts/unixify.sh diff --git a/scripts/cp_keep.sh b/scripts/cp_keep.sh new file mode 100755 index 0000000..a251b6b --- /dev/null +++ b/scripts/cp_keep.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +# Just a normal copy program, BUT it never overwrites a file in the destination. +# if the filename is already taken, the new file will get an incrementing number as postfix added just in fron of the dot before the extension. +# no extension, its added the end. +# example: filename.wav already exists, new file will get the name filename_1.wav. +# +# usage cp_keep.sh [src file] [dest folder] [prefix newfile] + + +export IFS=$'\n'; +export src=$1; +export dst=$2; +export prefix=$3 + +if [ -z $1 ]; then { + echo "must specify source file"; + exit; +} fi + +if [ -z $2 ]; then { + echo "must specify destination directory"; + exit; +} fi + + +if [ ! -d $2 ]; then { + echo "destination must be a directory"; + exit; +} fi + +if [ -d $1 ]; then { + echo "$1 is directory. .. quitting."; + exit; +} fi + +export src_dir=$(dirname $src); +export src_file=$(basename $src); + + +if [ "$dst" -ef "$src_dir" ]; then { + echo "source and destiation are same directory... quitting" + exit; +} fi + +export fname_new=$prefix$src_file; + +count=1; +while [ -e $dst/$fname_new ]; do { #destination filename already taken? + #add suffix before any dot, if no dot just append + if [[ "$fname_new" =~ \. ]]; then { + fname_new=$(echo $fname_new | sed -e "s/\./_$count\./g"); + } else { + fname_new=$fname_new"_$count" + } fi +# echo "filename already taken, suffix added: $dst/$fname_new" + count=$(($count+1)); +} done + +if [ "$count" -gt 1 ]; then { + echo "$dst/$src_file already existed, new name: $fname_new"; +} fi + +export cmd="cp \"$src_dir/$src_file\" \"$dst/$fname_new\""; + +#echo $cmd; +eval $cmd; diff --git a/scripts/renamer.pl b/scripts/renamer.pl new file mode 100755 index 0000000..14fbea0 --- /dev/null +++ b/scripts/renamer.pl @@ -0,0 +1,104 @@ +#!/usr/bin/perl + +my $help = <<'END_HELP'; + Sampling tool File Renamer + usage: renamer.pl DIR SEARCHREGEX REPLACEREGEX DOIT + + for every regular file in DIR, sorted by mtime, + replaces the SEARCHREGEX with REPLACEREGEX in every filename. + Does NOT rename anything unless DOIT! + + Special Variables are: + %NR% - the index number for the file with the current sorting + + no captures support in regex :( +END_HELP + + +use strict; +use warnings; + +use Data::Dumper qw(Dumper); +use POSIX qw(strftime); +use Cwd; +use File::stat; + +my $dir = "-?"; +$dir = $ARGV[0]; +my $regexSearch = $ARGV[1]; +my $regexReplace = $ARGV[2]; +my $reallyDoIt = $ARGV[3]; + +if ($dir eq "-?") { + usage(); +} + +if(!$dir) { + print "Error: Need a directory.\n"; + die "\n"; +} +if(!$regexSearch) { + print "Error: Need a search regex.\n"; + die "\n"; +} +if(!$regexReplace) { + print "Error: Need a replace regex.\n\n"; + die "\n"; +} + +chdir($dir) || die "FATAL: cant chdir"; + +print getcwd()."\n"; + +opendir( DIR, getcwd() ); +my @files = readdir(DIR); +closedir(DIR); + +#filter out dirs +my @filesNoDir; +foreach (@files) { + if(! -d $_) { + push(@filesNoDir,$_); + } +} + +@files = @filesNoDir; + +my @sorted_files = sort { stat($a)->mtime <=> stat($b)->mtime } @files; + +my $fname = ""; +my $fstat = ""; +my $mtime = ""; + +my $fname_new = ""; +my $counter = 1; +my $regexReplaceNew = ""; +my $counterFmt; +for (@sorted_files) { + $fname = $_; + $fstat = stat($_); + $mtime = strftime('%Y/%m/%d %H:%M:%S',localtime($fstat->mtime)); + + $regexReplaceNew = $regexReplace; + $counterFmt = sprintf("%03s",$counter); + $regexReplaceNew =~ s/%NR%/$counterFmt/g; + + $fname_new = $fname; + $fname_new =~ s/$regexSearch/$regexReplaceNew/; +# $fname_new =~ s/(.*?)\s1-/%NR%_$1/; + + printf "%-40s%-40s%-20s\n",$fname_new,$fname,$mtime; + + if($reallyDoIt) { + rename($fname,$fname_new); + } + + $counter++; +} + + + +sub usage { + print $help; + die "\n"; +} diff --git a/scripts/unixify.sh b/scripts/unixify.sh new file mode 100755 index 0000000..9065212 --- /dev/null +++ b/scripts/unixify.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Replaces odd characters in filenames and directories with an underline +# When there are more consecutive odd characters what would result in ____ sth like this, it collates to a single underline. +# When the new unixified filename is already taken, a counted suffix will be added before an eventuel period in the filename, otherwise just append. +# Will never overwrite a file. + +# usage: inixify.sh [filename] +# filename The file to unixify, can be file or folder. + + +export IFS=$'\n'; +export fname_full=$1; +#export out=$2; + +function sanitise { + local retval=$(echo $1 | gsed -e 's/[^A-Za-z0-9#./_-]/_/g'); # replace everything else with _ + retval=$(echo $retval | gsed -e 's/\.\{2,\}/\./g'); # replace >1 consecutive . with one . + retval=$(echo $retval | gsed -e 's/_\{2,\}/_/g'); # replace >1 consecutive _ with one _ + + echo $retval; +} + +export current_dir=$(dirname $fname_full); +export current_file=$(basename $fname_full); + +export fname_new=$(sanitise $current_file); # unixify + +if [ "$current_file" != "$fname_new" ]; then { #any changes been needed? + + count=1; + while [ -e $current_dir/$fname_new ]; do { #new filename already taken? + #echo file exists: $current_dir/$fname_new; + + #add suffix before any dot, if no dot just append + if [[ "$fname_new" =~ \. ]]; then { + fname_new=$(echo $fname_new | sed -e "s/\./_$count\./g"); + } else { + fname_new=$fname_new"_$count" + } fi + + count=$(($count+1)); + } done + + echo -n $current_dir/$fname_new + + if [ "$count" -gt 1 ]; then { + echo " suffix nr added: $(($count-1))"; + } else { + echo ""; + } fi + + export cmd="mv \"$fname_full\" \"$current_dir/$fname_new\""; + + # echo $cmd; + eval $cmd; +} else { + echo -ne; + echo $fname_full" filename already ok."; +} fi