Browse Source

Add useful scripts

master
heck 3 years ago
parent
commit
2000c502d8
  1. 67
      scripts/cp_keep.sh
  2. 104
      scripts/renamer.pl
  3. 60
      scripts/unixify.sh

67
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;

104
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";
}

60
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
Loading…
Cancel
Save