Bizarre mv-Operation

390
macek

Die Verwendung eines Umbenennungsprogramms hat einige meiner Dateien schwer beschädigt. Ich versuche, sie wieder in Ordnung zu bringen.

Ich habe folgende Dateistruktur:

./Hello World/some-filename.ext
./Kitty Parade/another.ext
./Third Example/abc.ext
./some-filename.ext2
./another.ext2
./abc.ext2

Das Ziel ist das Verschieben der Dateien im aktuellen Ordner (./) in ihre ursprünglichen Ordner.

Zum Beispiel:
another.ext2gehört in den ./Kitty Parade/Ordner
some-filename.ext2gehört in den ./Hello World/Ordner
abc.ex2gehört in den ./Third Example/Ordner`

Die Regel kann folgendermaßen beschrieben werden: Wenn im aktuellen Ordner ( ./) eine Datei vorhanden ist, suchen Sie einen Ordner, der eine Datei mit demselben Dateinamen (aber mit einer anderen Erweiterung) enthält, und verschieben Sie sie in diesen Ordner. Hinweis: Es gibt keine zuverlässige Beziehung zwischen ./myFilenameund der Datei ./originalFolderName.

Dies geschah bei über 4.000 Dateien, sonst würde ich es manuell machen. Mögliche hilfe?

2

1 Antwort auf die Frage

5
whitequark

Probiere dieses Stück Muschelmagie aus:

for i in *.*; do BASE=$(basename "$i" .ext2) LIST=*/"$".* DIR=$(dirname "$") mv -n "$i" "$" done 

Oder als Oneliner:

for i in *.*; do mv -n "$i" "$(dirname */"$(basename "$i" .ext2)".*)"; done 

Vor:

whitequark@forth:~/test$ ls * test 1.ext2 test 2.ext2 test 3.ext2  f 1: test 1.ext  f 2: test 2.ext test 3.ext 

Nach dem:

whitequark@forth:~/test$ ls * f 1: test 1.ext test 1.ext2  f 2: test 2.ext test 2.ext2 test 3.ext test 3.ext2 

Der -nSchalter schützt Sie vor dem Überschreiben.

ls `* /" $ ". *` heh, nice Immer verwendete find dafür. skarface vor 14 Jahren 0
"ls" ist nicht erforderlich: `LIST = * /" $ ". *` und `" $ (dirname "* /" $ (Basisname "$ i" .ext2) ". *") " Dennis Williamson vor 14 Jahren 0
@Dennis: Danke, geändert. das ist von der vorherigen Version des Befehls geblieben. whitequark vor 14 Jahren 0