Verschieben Sie alle Dateien in einem Verzeichnis in einem Unterverzeichnis

2

Für dieses einfache Problem kann ich keine schnelle Lösung finden: Ich habe diesen Baum:

fatherDir
   -File1.txt
   -SomeFile.txt
    ...
   - A name.txt
   -sonDir

Ich möchte alle Dateien in fatherDir in fatherDir / SonDir verschieben.

mv * sonDir

Da sonDir in fatherDir ist, erhalte ich eine Fehlermeldung.

Wie kann man das erreichen?

Federico Ponzi
quelle

Antworten:

2

Um alle Dateien zu finden, fatherDiranstatt sie zu verwenden *(was Ihnen auch die sonDirMöglichkeit gibt)

find fatherDir -type f -maxdepth 1 -exec mv {} fatherDir/sonDir \+

Das {}wird durch jeden gefundenen Dateinamen ersetzt, und alle werden in das Zielverzeichnis verschoben.

slhck
quelle
1

Ein Ansatz könnte sein, grep in Kombination mit xargs zu verwenden:

ls -A | egrep -v sonDir | xargs -i mv {} sonDir
  • Listen Sie zuerst alle Dateien und Ordner im aktuellen Verzeichnis (zB fatherDir) mit auf ls
  • Stellen Sie sicher, dass Sie auch versteckte Dateien mit dem -AFlag auslesen
  • egrep -v Mit dieser Option können Sie sonDir von der Druckausgabe ausschließen
  • Erstellen Sie eine Befehlszeile aus der Standardeingabe mit xargsund ersetzen Sie diese {}durch den Dateinamen. Option -iist hier erforderlich!

Das ist es! Ich benutze diesen Ansatz ziemlich häufig, da Sie damit nicht nur einen Ordner, sondern auch verschiedene Ordner und Dateien gleichzeitig ausschließen können. Falls Sie zB ausschließen möchten sonDir daughterDirund nephew.filedies durch einfaches Angeben tun können egrep -v '(sonDir|daughterDir|nephew.file)', bleibt der Rest des oben gezeigten Befehls derselbe ... und es gibt viele Variationen!

JFP
quelle
-1

Ist das wichtig? Der Umzug passiert immer noch. Was Sie bekommen, ist eher eine Warnung. Sie können das stderr nach / dev / null umleiten. Wenn es Sie immer noch stört, verwenden Sie find, wie von slhck erklärt, oder so ähnlich:

mv `ls * | grep -v sonDir` sonDir
user3307862
quelle
Dies schlägt fehl, wenn eine Datei ein Leerzeichen im Namen enthält, z. B. mit "A name.txt" wie im obigen Beispiel.
Slhck