Shellscript: Ordner verschieben + Struktur beibehalten

Mein Ziel

Ich organisiere meine Projekte in Ordnern. Diese Ordner befinden sich alle in meinem Completed projectsOrdner. Ich fange an, sie in einem Archived ProjectsOrdner zu archivieren, und ich möchte sie in Unterordnern nach Client archivieren. Ich verwende immer den Kundennamen im Namen des Projektordners. Zum Beispiel habe ich Projektordner namens Appeal [May 2014] - Developmentund Identity Package [2014] - Communications. (Meine internen Kunden sind Abteilungsnamen: Academics, Communications, Development...) So möchte ich, dass sie archiviert werden:

Archived Projects >> Development >> Appeal [May 2014] - Development
Archived Projects >> Communications >> Identity Package [2014] - Communications

Jeder Projektordner hat auch einen einzigartigen Satz von Unterordnern. Diese Struktur möchte ich bewahren.

Mein Ansatz

Ich habe mit diesem Skript jeweils einen Client ausgewählt:

#!/bin/bash
# Go to the Completed Projects folder.

cd /Volumes/communications/Projects/Completed\ Projects/

# Find a folder with a specified string (e.g. "Academics") in its name.
# Move (not copy) the folder to its corresponding sub-folder of the Archived Projects folder. (e.g. /Academics)

find . -type d | while read folder ; do
if [[ "$folder" = *Academics* ]]; then
    echo "Moving $folder";
    mv "$folder" /Volumes/communications/Projects/Archived\ Projects/Academics/;
fi
done

Ich habe das Skript so aufgerufen, indem ich im Terminal zu dem Verzeichnis mit meinen Skripten navigiert habe, indem ich cd ~/Dropbox/scripts./move_project_academics.sh↩ eingetippt habe

Mein Problem

Der rudimentäre Musterabgleich funktioniert, mvwirft aber einen Fehler:

mv: rename /Appeal [May 2014] - Development/SUB1/SUB2 to
/dest/Archived Projects/Development/SUB2: No such file or directory.

Offensichtlich gebe ich ihm die falschen Anweisungen. (Obwohl dieses Skript seltsamerweise einige Zeit funktioniert hat .) SUB2 gehört /dest/Archived Projects/Development/überhaupt nicht dazu. SUB2 sollte in SUB1 verschachtelt sein, das wiederum im Projektordner verschachtelt sein sollte.

Meine Fragen

Welcher Shell-Befehl würde einen Ordner verschieben und seine interne Struktur beibehalten? Und wie könnte es einen Ordner nach Kundennamen auswählen?


Auf Anfrage ist hier die gesamte Ausgabe, die an das Terminal gedruckt wird:

n$ ./move_project_academics.sh Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - to /Volumes/communications/Projects/Archived Projects/Academics/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry -: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Contracts mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Contracts to /Volumes/communications/Projects/Archived Projects/Academics/Contracts: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Correspondence mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Correspondence to /Volumes/communications/Projects/Archived Projects/Academics/Correspondence: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Invoices mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Invoices to /Volumes/communications/Projects/Archived Projects/Academics/Invoices: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Planning Documents mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Planning Documents to /Volumes/communications/Projects/Archived Projects/Academics/Planning Documents: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Quotes mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Documentation/Quotes to /Volumes/communications/Projects/Archived Projects/Academics/Quotes: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry to /Volumes/communications/Projects/Archived Projects/Academics/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry/Audio Files mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry/Audio Files to /Volumes/communications/Projects/Archived Projects/Academics/Audio Files: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry/Fade Files mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry/Fade Files to /Volumes/communications/Projects/Archived Projects/Academics/Fade Files: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry/Session File Backups mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Drafts/[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry/Session File Backups to /Volumes/communications/Projects/Archived Projects/Academics/Session File Backups: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Final Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files/Copy mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files/Copy to /Volumes/communications/Projects/Archived Projects/Academics/Copy: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files/Design mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files/Design to /Volumes/communications/Projects/Archived Projects/Academics/Design: No such file or directory Moving ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files/RAW mv: rename ./[2013.04.05] - Audio - Academics - Course - Stephanie Hubach - Disability Ministry - /Source Files/RAW to /Volumes/communications/Projects/Archived Projects/Academics/RAW: No such file or directory

Lassen Sie uns den genauen Code und die Fehler sehen, da /dest in Ihrem Beispiel nicht aus Ihrem Code erzeugt werden kann. Und wie nennt man das Script
@Mark Hier bitte.
Sollte das nicht nach Stackoverflow verschoben werden?
@CousinCocaine: Von apple.stackexchange.com/help/on-topic : „Wir ermutigen zu AppleScript-, Automator- und UNIX-Shell-Scripting-Fragen sowie zur Verwendung von Tools wie Xcode für nicht sprachspezifische Aufgaben.“

Antworten (1)

Unter der Annahme, dass sich alle zu archivierenden Ordner direkt in befinden .../Completed Projects, könnte die Verwendung von find(die die gesamte Ordnerhierarchie durchquert) tatsächlich mehr schaden als nützen.

So könnte eine überarbeitete Version aussehen

#!/bin/bash

# Go to the Completed Projects folder.
cd /Volumes/communications/Projects/Completed\ Projects/

# Find a folder with a specified string (e.g. "Academics") in its name.
# Move (not copy) the folder to its corresponding sub-folder of the Archived Projects folder. (e.g. /Academics)

for folder in *; do
    if [[ -d "$folder" ]]; then
        echo "Moving $folder";
        if [[ "$folder" == *Academics* ]]; then
            mv "$folder" /Volumes/communications/Projects/Archived\ Projects/Academics/
        fi
    fi
done