Ich habe das folgende Skript erstellt, mit dem alte Dateien aus dem Quellverzeichnis in das Zielverzeichnis verschoben werden. Es funktioniert perfekt.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Dieses Skript verschiebt großartige Dateien. Es verschiebt auch Dateien des Quell-Unterverzeichnisses, erstellt jedoch kein Unterverzeichnis im Zielverzeichnis. Ich möchte dieses zusätzliche Feature darin implementieren.
mit beispiel
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Wenn ich dieses Skript ausführe, verschiebt es auch hexadezimale Dateien in das Maxi-Verzeichnis. Ich benötige jedoch dasselbe Hexadezimale, das in das Maxi-Verzeichnis erstellt werden soll, und verschiebt die Dateien dorthin in dasselbe Hexadezimale.
quelle
for x do
, da fehlt dir was;
:). Ich habe auch keine Ahnung, was Sie damit erreichen wollten,$0
aber ich bin ziemlich überzeugt, dass es so sein würdesh
:).for x; do
ist technisch nicht POSIX-konform ( Grammatik prüfen ), moderne Shells erlauben jedoch beidesfor x do
undfor x; do
; einige alte Borowski-Muscheln gruben nichtfor x; do
. Über moderne Muscheln, mitsh -c '…' arg0 arg1 arg2 arg3
,arg0
wird$0
,arg1
wird$1
usw. Wenn Sie sein wollen$0
, müssensh
Sie schreibensh -c '…' sh arg1 arg2 arg3
. Auch hier haben sich einige Bourne-Shells anders verhalten, aber POSIX gibt dies an.pushd
Das scheint eine bessere Wahl zu seincd
, da es weniger aufdringlich für die aktuelle Umgebung ist.Ich weiß,
find
wurde angegeben, aber das klingt nach einem Job fürrsync
.Ich benutze am häufigsten die folgenden:
Hier ist ein gutes Beispiel, wenn Sie nur Dateien eines bestimmten Dateityps verschieben möchten ( Beispiel ):
quelle
--remove-source-files
hilfreich, was effektiv dazu führt, dass Dateien verschoben statt kopiert werden. Dies ist eine großartige Anwendung von rsync.Sie könnten es mit zwei Instanzen von find (1) tun
Es gibt immer cpio (1)
Überprüfen Sie die Argumente für cpio. Die, die ich gegeben habe
quelle
Es ist nicht so effizient, aber der Code ist meiner Meinung nach leichter zu lesen und zu verstehen, wenn Sie nur die Dateien kopieren und anschließend löschen.
Hinweis: Von @MV entdeckter Fehler bei automatisierten Vorgängen:
quelle
Sie können dies tun, indem Sie den absoluten Pfad der von zurückgegebenen Datei
find
an Ihren Zielpfad anhängen :quelle
$destination
Sonderzeichen enthalten sind, da es in der inneren Hülle eine Erweiterung erfährt. Vielleicht meintest dudestination='\'"$destination"\''
? Das bricht noch an'
. Hierdurch werden auch Dateien erstellt, z. B./home/maxi/home/ketan/hex/foo
anstelle von/home/maxi/hex/foo
.Besser (am schnellsten und ohne Speicherplatz zu verbrauchen, indem Kopieren statt Verschieben ausgeführt wird), sind die Dateinamen auch dann nicht betroffen, wenn sie Sonderzeichen in ihren Namen enthalten:
Oder schneller: Verschieben einer Reihe von Dateien für mehrere CPUs gleichzeitig mit dem Befehl "parallel":
PS: Du hast einen Tippfehler, "soure" sollte "source" sein. Ich habe den Variablennamen beibehalten.
quelle
Dies ist weniger elegant, aber einfach, wenn die Anzahl / Größe der Dateien nicht zu groß ist
Zippen Sie Ihre Dateien zusammen in ein
zip
Archiv und entpacken Sie sie dann am Ziel ohne die-j
Option. Standardmäßig erstellt zip die relative Verzeichnisstruktur.quelle
Versuchen Sie diesen Weg:
quelle
Da es anscheinend keine wirklich einfache Lösung dafür gibt und ich sie sehr oft brauche, habe ich dieses Open Source-Dienstprogramm für Linux erstellt (erfordert Python): https://github.com/benapetr/smv
Es gibt mehrere Möglichkeiten, wie Sie damit das erreichen können, was Sie benötigen. Am einfachsten wäre jedoch Folgendes:
Sie können es auch im Trockenmodus ausführen, damit es nur das druckt, was es tun würde
Oder falls diese Dateiliste zu lang ist, um in eine Argumentationszeile zu passen, und es Ihnen nichts ausmacht, Python für jede einzelne Datei auszuführen
quelle