Verzeichnisse nach grep verschieben

438
poissonbreaker

Ich habe den nächsten Befehl verwendet, um einige Verzeichnisse in den Ordner "build_tools" zu verschieben. Das Ergebnis war jedoch nicht das, was ich erwartet hatte.

ls -l | grep 2014-03 | awk '' | xargs mkdir build_tools/{} && mv {}/ build_tools/{}/ 

Es hat den Ordner "build_tools" in einen der Ordner verschoben, die von awk (zlib) zusammen mit den restlichen Verzeichnissen ausgegeben wurden, und dann blieb diese Nachricht hängen:

mkdir: no se puede crear el directorio «zlib»: El archivo ya existe 

Kann jemand ein wenig Licht auf meinen Fehler werfen?

EDIT 1:

Die Ausgabe von ls -l gibt mir:

drwxr-xr-x 3 poissonbreaker poissonbreaker 4096 2011-05-02 09:58 antlr3.2 -rw-r--r-- 1 poissonbreaker poissonbreaker 318588 2011-05-17 16:21 AppFramework-1.03.jar -rw-r--r-- 1 poissonbreaker poissonbreaker 0 2014-03-04 09:53 awk drwxr-xr-x 4 poissonbreaker poissonbreaker 4096 2013-01-11 23:13 clutter-sharp -rw-r--r-- 1 poissonbreaker poissonbreaker 429 2014-01-14 09:49 Dependencias 

Ich möchte nur die Dateien mit dem Datumsfeld ($ 6) für 2014-03 erhalten, deshalb mache ich ein einfaches grep davon als (Keine Datei im Verzeichnis hat als Dateinamen dieses Muster):

ls -l | grep 2014-03 

Was bringt:

-rw-r--r-- 1 poissonbreaker poissonbreaker 0 2014-03-04 09:53 awk -rw-r--r-- 1 poissonbreaker poissonbreaker 429 2014-01-14 09:49 Dependencias 

Dann bekomme ich das Dateinamenfeld ($ 8) jeder Datei über awk, um schließlich in den build_tools-Ordner verschoben zu werden (an diesem Punkt weiß ich, was mein Fehler war - der build_tools-Ordner wurde an diesem Datum ebenfalls erstellt: S). Ich werde diese Frage jedoch hier belassen, falls einige Teile für jeden nützlich sein könnten.

EDIT 2: Ich habe den awk-Ausdruck geändert in:

awk '' 

damit es sinnvoll ist.

1
Siehe meine aktualisierte Antwort slhck vor 10 Jahren 0

2 Antworten auf die Frage

1
slhck

Ich gehe davon aus, dass Sie GNU haben find. Wenn Sie Dateien oder Verzeichnisse verschieben möchten, die innerhalb eines bestimmten Zeitraums geändert wurden (z. B. März 2014), gehen Sie folgendermaßen vor:

find . -maxdepth 1 \ -newermt 2014-02-28 -not -newermt 2014-04-01 \ -not -name 'build_tools' \ -exec mv {} build_tools \+ 

Erläuterung:

  • In diesem Verzeichnis finden, ohne Unterverzeichnisse
  • Dateien im Bereich zwischen 28. Februar und 1. April, wobei mtsich die Änderungszeit bezieht. Sie können auch ctnach der Erstellungszeit suchen.
  • das heißt nicht build_tools
  • verschiebe sie alle nach build_tools. Das \+bedeutet, dass alle gefundenen Datei- / Verzeichnisnamen ersetzt werden {}, und nicht einer nach dem anderen. Wenn Sie eine nach der anderen möchten, müssen Sie \;stattdessen eine.

Einige Sachen:

  • Analysieren Sie nicht die Ausgabe vonls . Das Format ist vom Betriebssystem abhängig. Die Auswahl von Spalten mit awkFehlern schlägt fehl, wenn die Datei- / Verzeichnisnamen Leerzeichen enthalten.

  • Sie haben früher &Befehle verkettet, setzen jedoch &nur einen Prozess in den Hintergrund. Wenn überhaupt, hätten Sie verwenden sollen &&, aber alles in allem wäre es ziemlich kompliziert, das zu erreichen, was Sie wollen.

Ich habe es mir nachgeahmt, aber dies scheint mir das Richtige zu sein. Das wollte ich, danke! Ich kann dir noch keine Punkte geben, sorry. poissonbreaker vor 10 Jahren 0
0
poissonbreaker

Die richtige Version für meine Lösung erfordert xargs, um mehrere Befehle zu verarbeiten. Dies kann erreicht werden, indem die Befehle mit folgendem Befehl umbrochen werden:

sh -c (or bash -c) 'Command1; Command2; .. Comandn' 

Die richtige Lösung ist also:

ls -l awk ' $8!=build_tools && $6 ~ /2013-03*/ ' | xargs -I @ sh -c 'mkdir build_tools/@; mv @ build_tools/@' 

Beachten Sie, dass dadurch ein neuer Ordner für jede zu verschiebende Datei erstellt wird.

Das Fazit lautet: Während andere sich darum bemüht haben, unser Leben mit besseren und spezialisierten Werkzeugen einfacher zu gestalten, können wir immer noch viel von alten Pipe-Anfragen lernen. Zumindest in meinem Fall :)