diff --git a/hidedoubles.sh b/hidedoubles.sh index 250f20a..6497090 100755 --- a/hidedoubles.sh +++ b/hidedoubles.sh @@ -48,7 +48,7 @@ while read ab; do for i in "${supprimable[@]}"; do if true; then # diff -q "$orig" "$i" > /dev/null; then qi="${i//\'/$q}" - echo "mv -i '$qi' '${qi%/*}/.%${qi##*/}' # '${orig//\'/$q}'" + echo "[ -e '$qi' ] && mv -i '$qi' '${qi%/*}/.%${qi##*/}' # '${orig//\'/$q}'" fi done fi diff --git a/pseudo-empty-dirs.sh b/pseudo-empty-dirs.sh index 67eec0d..54f7a46 100755 --- a/pseudo-empty-dirs.sh +++ b/pseudo-empty-dirs.sh @@ -1,5 +1,12 @@ #!/bin/zsh +# masque les dossiers qui ne contiennent que des fichiers dont le nom est +# .%fichier, récursivement (les dossiers sont masqués en préfixant ".%" à +# leur nom, donc les dossiers ne contenant que des fichiers / dossiers +# masqués le seront eux aussi. +# Un dossier n'est pas masqué ssi il contient au moins un fichier +# (regular file) ou dossier non masqué. + setopt dotglob dohide() { @@ -19,7 +26,7 @@ dohide() { si=$(($si-1)) dohide "${subdirs[si]}" done - for x in *(N); do + for x in *(/,.NoN); do # N = pas d'erreur quand vide, oN = order none, / = dossiers, . = fichiers if [ "${x[0,2]}" != ".%" ]; then pseudo_empty="0" break; diff --git a/remdoubles b/remdoubles index 052daf4..3332cc9 100755 --- a/remdoubles +++ b/remdoubles @@ -42,14 +42,19 @@ unset supprimable n=0 orig="" q="'\\''" # escaped quote. -sort | while read ab; do +#sort | \ +while read ab; do sum="${ab%% *}" nom="${ab#* }" if [ "$sum" != "$oldsum" ]; then if [ -n "$orig" ]; then for i in "${supprimable[@]}"; do - if diff -q "$orig" "$i" > /dev/null; then - echo "rm '${i//\'/$q}'" + if [ -e "$orig" ] && [ -e "$i" ] && cat "$i" | diff -q "$orig" - > /dev/null; then + destdir="delete/${i%/*}" + [ -e "$destdir" ] || mkdir -p "$destdir" + mv -i "$i" "$destdir" + echo -n '.' + #echo "myrm '${i//\'/$q}'" fi done fi diff --git a/remdoubles.py b/remdoubles.py new file mode 100755 index 0000000..24ca8ad --- /dev/null +++ b/remdoubles.py @@ -0,0 +1,48 @@ +#!/usr/bin/python + +import sys +import os +import errno +import shutil + +def identicalFiles(pathA, pathB): + bufsize = 4096 + with open(pathA, 'rb') as a: + with open(pathB, 'rb') as b: + while True: + dataA = a.read(bufsize) + dataB = b.read(bufsize) + if dataA != dataB: + return False + if not dataA: + return True + +oldhash = "" +original = "" +supprimable = [] +for line in sys.stdin: + hash = line[0:48] + file = line[50:-1] + if hash != oldhash: + if original != "": + for i in supprimable: + print i + if os.path.exists(i) and identicalFiles(original, i): + destfile = "delete/" + i + try: + os.makedirs(os.path.dirname(destfile)) + except OSError as e: + if e.errno == errno.EEXIST: + pass + else: + raise + shutil.move(i, destfile); + supprimable = [] + original = "" + if file[0:2] == 'c/': # Delete files in the directory named c + supprimable.append(file) + else: + if original == "" and os.path.exists(file): + original = file + + oldhash = hash diff --git a/unhide.py b/unhide.py new file mode 100755 index 0000000..f93dcee --- /dev/null +++ b/unhide.py @@ -0,0 +1,12 @@ +#!/usr/bin/python + +import shutil; +import sys; + +for dir in sys.stdin: + file = sys.stdin.next() + if file[0:2] == ".%": + dir = dir[:-1] + file = file[:-1] + shutil.move(dir + '/' + file, dir + '/' + file[2:]) + print "", diff --git a/unhide.py.sh b/unhide.py.sh new file mode 100755 index 0000000..e68610d --- /dev/null +++ b/unhide.py.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +find "$@" -depth -name '.%*' -printf '%h\n%f\n' | ./unhide.py diff --git a/unhide.sh b/unhide.sh new file mode 100755 index 0000000..f1b81d9 --- /dev/null +++ b/unhide.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +find "$@" -depth -name '.%*' | while read ab; do aa="${ab##*/}"; mv -i "$ab" "${ab%/*}/${aa#.%}"; echo -n .; done