URL: https://www.overclockers.at/linux/find_xargs_subshell_quotes_203360/page_1 - zur Vollversion wechseln!
Ich hab hier 2 Festplatten mit unterschiedlichen Versionen eines Directory-Trees. Ich möchte von der zweiten Festplatte alle Dateien löschen, die eine identische Kopie auf der ersten Festplatte haben.
Folgendes Shellscript funktioniert fast, aber nicht ganz:
Code:#!/bin/bash DELDIR=/mnt/1/other DELLIST=deletelist.sh find . -type f -print0 | xargs -0 -I! -n1 bash -c "[[ -f \"$DELDIR/!\" ]] && cmp \"!\" \"$DELDIR/!\" && echo \"rm !\" >> $DELLIST"
Vielleicht willst du dir mit app-misc/fdupes (siehe auch: http://en.wikipedia.org/wiki/Fdupes ) etwas Arbeit ersparen?
Wenn nicht, mach ich mich wohl im Laufe dieses hoffentlich ruhigen Abends an einen Rewrite dieses Monsters
Zitat von COLOSSUSVielleicht willst du dir mit app-misc/fdupes (siehe auch: http://en.wikipedia.org/wiki/Fdupes ) etwas Arbeit ersparen?
Zitat von COLOSSUSWenn nicht, mach ich mich wohl im Laufe dieses hoffentlich ruhigen Abends an einen Rewrite dieses Monsters
Ok, ein paar Fragen zum Problem:
Kannst du dir sicher sein, dass Dateien in den beiden Verzeichnissen, welche keinen Inhalt haben, gefahrlos geloscht werden koennen?
Ist davon auszugehen, dass nicht mehr als zwei Dateien (jeweils eine pro Verzeichnis) inhaltsgleich sind?
Ist davon auszugehen, dass inhalsgleiche Dateien, die im selben Verzeichnis(baum) vorkommen, geloescht werden duerfen?
Haben nichtleere inhaltsgleiche Dateien auch immer den selben Dateinamen in beiden Verzeichnissen?
Zitat von COLOSSUSOk, ein paar Fragen zum Problem:
Kannst du dir sicher sein, dass Dateien in den beiden Verzeichnissen, welche keinen Inhalt haben, gefahrlos geloscht werden koennen?
Ist davon auszugehen, dass nicht mehr als zwei Dateien (jeweils eine pro Verzeichnis) inhaltsgleich sind?
Ist davon auszugehen, dass inhalsgleiche Dateien, die im selben Verzeichnis(baum) vorkommen, geloescht werden duerfen?
Haben nichtleere inhaltsgleiche Dateien auch immer den selben Dateinamen in beiden Verzeichnissen?
Code:for each file f in $dir1 (incl. all subdirs) if $dir2/$f exists if $dir1/$f and $dir2/$f have identical content delete file $dir2/$f endif endif endfor
http://johannes.truschnigg.info/tmp/thatmerge.bash
Ohne -f als argv[3] => dry-run, es wird also nichts wirklich geloescht.Code:Usage: thatmerge DIR1 DIR2 [-f]
Danke, das funktioniert gut. Ich hab zum Glück keine mehrzeiligen Dateinamen.
Fürs Archiv, hier ist der Code:
Code:#!/usr/bin/env bash unset ACTION DEST SRC DIR_1 DIR_2; export DIR_1="${1}"; export DIR_2="${2}"; if [ ! -d "${DIR_1}" ] || [ ! -d "${DIR_2}" ]; then exit 1; fi [[ "${3}" == "-f" ]] && ACTION="/bin/rm " || ACTION="echo rm " while read SRC; do DEST="${SRC/${DIR_1}/${DIR_2}}"; [[ -f "${DEST}" ]] && cmp -s "${DEST}" "${SRC}" && ${ACTION} "${DEST}" && echo "${DEST} unlinked." done < <(find "${DIR_1}" -type f -print)
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025