Tauschen Sie eine Reihe von Dateinamen bedingt aus

326
dexter

Wenn habe folgendes Problem: Ich habe eine Reihe von Dateien, die paarweise (aber nicht immer) kommen. Es gibt 2400 ?????? _ 001.jpg und 2400 ?????? _ 002.jpg. Ich muss die _001 und _002 tauschen. Also dachte ich, ich könnte das tun:

for f in $(find -type f -name "*_002.jpg"); do mv "$" "$_003.jpg"; done for g in $(find -type f -name "*_001.jpg"); do mv "$" "$_002.jpg"; done for h in $(find -type f -name "*_003.jpg"); do mv "$" "$_001.jpg"; done 

Seltsamerweise nach Schritt 2 habe ich * _003.jpg und * _002.jpg, die identisch sind. Was geht hier vor sich?

Dann wird das Problem etwas schwieriger: Ich möchte nur tauschen, wenn beide Mitglieder des Paares existieren. Manchmal existiert nur 2400 ?????? _ 001.jpg und 2400 ?????? _ 002.jpg fehlt. Wenn dies der Fall ist, möchte ich die 2400 alleine lassen.

2

1 Antwort auf die Frage

0
chaos

Versuchen Sie dies in einer bashShell:

find -type f -name "*_001.jpg" -print0 | while read -d $'\0' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "$_002.jpg" ] && \ mv -v "$f" "$t" && mv -v "$_002.jpg" "$f" && mv -v "$t" "$_002.jpg" done 

Als Skript sollte es so aussehen (etwas lesbarer):

#!/bin/bash find -type f -name "*_001.jpg" -print0 | while read -d $'\0' f; do t=$(mktemp --tmpdir=$(dirname "$f")) [ -f "$_002.jpg" ] && \ mv -v "$f" "$t" && \ mv -v "$_002.jpg" "$f" && \ mv -v "$t" "$_002.jpg" done 

Erläuterung:

  • Zuerst erstellen wir eine Liste von Dateien mit find. Um seltsame Dateinamen zu verarbeiten, verwenden Sie diese -print0, um Dateien mit dem Null-Byte zu trennen
  • while read -d $'\0' f: findLiest die Ausgabe von begrenzt durch das Nullbyte
  • Erstellen Sie eine temporäre Datei
  • Überprüfen Sie, ob beide Dateien vorhanden sind
  • Verschieben Sie das Original (001) in die Tempfildatei
  • Bewegen Sie 002 zu 001
  • Verschieben Sie die Tempfile auf 002
Wenn ich dieses Skript in eine .sh-Datei stelle, damit ich es in der Befehlszeile verwenden kann, bekomme ich 6: read: Illegal-Option -d. Wenn ich das Skript direkt in die Befehlszeile kopiere, wird es ausgeführt, aber seltsamerweise sehe ich keine Änderungen. Mit Ausnahme der Erstellung von Provisorien. Dann in der Zeile [-f "$ "] && [-f "$ _002.jpg"] Ich denke, Sie prüfen, ob beides vorhanden ist. Aber Sie müssten nicht erst die Existenz des ersten prüfen, oder? dexter vor 8 Jahren 0
@dexter Welche Shell benutzt du? Was ist die Version von bash? "bash --version" chaos vor 8 Jahren 0
@dexter In einem Skript müssen Sie als erste Zeile `#! / bin / bash` verwenden chaos vor 8 Jahren 0
Ich versuche @chaos ... dexter vor 8 Jahren 0
GNU bash, Version 4.3.11 (1) -freigabe (x86_64-pc-linux-gnu). Also habe ich zuerst alles in iswp.sh kopiert und dann: sh iswp.sh. dexter vor 8 Jahren 0
@dexter Ich habe meine Antwort bearbeitet und du hast recht. das erste `[-f" $ "]` wird natürlich nicht benötigt. chaos vor 8 Jahren 0
Ich denke wirklich, dass das Skript funktionieren sollte, aber aus irgendeinem Grund auf meinem System funktioniert es nicht. Es ändert sich nichts außer der Erstellung von temporären Provisorien mit einer Länge von 0 Byte. dexter vor 8 Jahren 0
Es sind keine Änderungen sichtbar, aber dies wird ausgedruckt. Dies scheint das zu sein, was zu erwarten ist: './2400A00/2400A00118_001.jpg' -> './2400A00/tmp.iSUZcuMKEM' './2400A00/2400A00118_002.jpg' -> './2400A00/2400A00118_001.jpg' './2400A00/tmp.iSUZcuMKEM' -> './2400A00/2400A00118_002.jpg' BTW: Bei meinem System finden Sie | während Kombination funktionierte nicht. Ich musste es ändern in: für f in $ (find -type f -name "* _001.jpg"); tun dexter vor 8 Jahren 0
@dexter Was ist das? chaos vor 8 Jahren 0
Ist es Ubuntu 14.04. Aber ich fange an zu denken, dass in letzter Zeit zu viele seltsame Dinge auf meiner Maschine passieren. Sehr langsamer Zugriff auf einfache Textdateien (240 Byte) dauert mehr als 20 Sekunden. zu öffnen .... denke die Controller vielleicht Mist. dexter vor 8 Jahren 0
@dexter Ich habe das oben in einem Ubuntu 12.04 getestet und es hat funktioniert. Wie Sie im Kommentar erwähnt haben, gibt der Befehl `mv` die Pfade korrekt aus, sodass die Datei verschoben wird. Wenn Sie mit dem GUI-Datei-Browser arbeiten, wird das Verzeichnis möglicherweise nicht aktualisiert. chaos vor 8 Jahren 0
Ich bin sicher, dass es funktioniert, es sieht gut aus und macht Sinn. Muss herausfinden, was hier los ist. Selbst ein Neustart hilft nicht. dexter vor 8 Jahren 0