Bash script voor verplaatsen bestanden

Pagina: 1
Acties:

  • Wtrdk
  • Registratie: Mei 2006
  • Laatst online: 03-09 11:39
Ik ben een bash-n00b en heb een bash scriptje gemaakt (niet meer dan een aantal commando's die elkaar opvolgen) om een bepaalde directory te doorzoeken op videobestanden en deze dan te verplaatsen naar een bepaalde map.
Volgens mij moet dat ook in één regel kunnen, zodat ik het niet via een scriptje hoef te doen, maar ik kom er niet uit. In één regel/commando lijkt me netter en efficienter.
Nu heb ik dit:
code:
1
2
3
4
5
6
7
#!/bin/bash

find /home/homedir/Foto -iname "*.avi" -exec mv {} /home/homedir/Video/ \;
find /home/homedir/Foto -iname "*.mov" -exec mv {} /home/homedir/Video/ \;
find /home/homedir/Foto -iname "*.mp4" -exec mv {} /home/homedir/Video/ \;
find /home/homedir/Foto -iname "*.mkv" -exec mv {} /home/homedir/Video/ \;
find /home/homedir/Foto -iname "*.m4v" -exec mv {} /home/homedir/Video/ \;


Ik heb dit geprobeerd maar dat werkt niet:
code:
1
find /home/homedir/Foto -iname "*.{avi,mov,mp4,mkv,m4v}" -exec mv {} /home/homedir/Video/ \;


Heeft iemand een tip/idee hoe dit efficienter kan?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
code:
1
-iname "*.avi" -o -iname "*.mov"

-o is dan gewoon or

  • Wtrdk
  • Registratie: Mei 2006
  • Laatst online: 03-09 11:39
Snelle reactie! :)

Ik heb het als volgt geprobeerd, maar er wordt niets verplaatst:
code:
1
find /home/homedir/Foto -iname "*.avi" -o -iname "*.mov" -o -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.m4v"  -exec mv {} /home/homedir/Video/ \;

  • ItMeAedri
  • Registratie: Maart 2009
  • Laatst online: 15:44
Moet je het resultaat niet pipen naar het move commando?

  • Foeijonghaai
  • Registratie: Juli 2001
  • Laatst online: 24-09 14:52
Als je zonder -exec probeert, maar met bijv -ls of -print, krijg je dan wel output?

  • Wtrdk
  • Registratie: Mei 2006
  • Laatst online: 03-09 11:39
-ls en -print leveren geen resultaat op. Als ik slechts één bestandstype zoek werkt het wel met -ls

code:
1
find /home/homedir/Foto -iname "*.mov" -ls
levert alle *.mov bestanden op
code:
1
find /home/homedir/Foto -iname "*.mov" -o -iname "*.mp4" -ls
levert alleen alle *.mp4 bestanden op, en lijkt *.mov te negeren

  • Cidolfas
  • Registratie: September 2007
  • Laatst online: 16:30
w.d schreef op woensdag 25 september 2013 @ 12:20:
-ls en -print leveren geen resultaat op. Als ik slechts één bestandstype zoek werkt het wel met -ls

code:
1
find /home/homedir/Foto -iname "*.mov" -ls
levert alle *.mov bestanden op
code:
1
find /home/homedir/Foto -iname "*.mov" -o -iname "*.mp4" -ls
levert alleen alle *.mp4 bestanden op, en lijkt *.mov te negeren
Haal de "-ls" eens weg, wat krijg je dan?

i5-10600K | MSI MAG Tomahawk Z490 | Asus DUAL GeForce RTX 3070 OC | Corsair Vengeance 32 GB 3600 Mhz | Noctua NH-D15 Chromax.Black | Corsair RM850x | Fractal Design Meshify S2


  • Foeijonghaai
  • Registratie: Juli 2001
  • Laatst online: 24-09 14:52
w.d schreef op woensdag 25 september 2013 @ 12:20:
-ls en -print leveren geen resultaat op. Als ik slechts één bestandstype zoek werkt het wel met -ls

code:
1
find /home/homedir/Foto -iname "*.mov" -ls
levert alle *.mov bestanden op
code:
1
find /home/homedir/Foto -iname "*.mov" -o -iname "*.mp4" -ls
levert alleen alle *.mp4 bestanden op, en lijkt *.mov te negeren
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ touch 1.dit
$ touch 2.dit
$ touch 3.dit
$ touch 3.dat
$ touch 2.dat
$ touch 1.dat
$ ls
1.dat  1.dit  2.dat  2.dit  3.dat  3.dit
$ find . -name "*.dat" -print
./2.dat
./1.dat
./3.dat
$ find . -name "*.dat" -o -name "*.dit" -print
./3.dit
./1.dit
./2.dit
$ find . -name "*.dit" -o -name "*.dat" -print
./2.dat
./1.dat
./3.dat

Hmm, reproduceerbaar.

Aha.

Find heeft een debug optie:
code:
1
2
3
4
$ find -D tree . -name "*.dit" -o -name "*.dat" -print | more
Predicate List:
[-name] [-o] [-name] [-a] [-print] 
...

En or is zwakker dan and.

Nu met haakjes:
code:
1
2
3
4
5
6
7
8
9
10
11
$ find -D tree . \( -name "*.dit" -o -name "*.dat" \) -print
Predicate List:
[(] [-name] [-o] [-name] [)] [-a] [-print] 
...
$ find . \( -name "*.dit" -o -name "*.dat" \) -print
./2.dat
./1.dat
./3.dit
./1.dit
./2.dit
./3.dat

[ Voor 35% gewijzigd door Foeijonghaai op 25-09-2013 12:31 ]


  • Wtrdk
  • Registratie: Mei 2006
  • Laatst online: 03-09 11:39
Zonder -ls krijg ik wel alle formaten te zien!
Ik heb hier -exec mv {} /home/wtrdk/Video \; achter gezet, en dan worden maar 3 bestanden verplaatst.

Zonder -ls:
wtrdk@www:~/Foto$ video
24641606 1332 -rw-rw-r--   1 wtrdk    wtrdk     1360647 Sep 24 15:52 /home/wtrdk/Foto/2013-09-21\ 13.44.12.mp4
24641600 30660 -rw-r--r--   1 wtrdk    wtrdk    31395710 Sep 24 15:52 /home/wtrdk/Foto/20111026_124246.mp4
24641604  612 -rw-rw-r--   1 wtrdk    wtrdk      622975 Sep 24 15:52 /home/wtrdk/Foto/2013-09-19\ 21.54.11.mp4
/home/wtrdk/Foto/2013-09-09 18.45.00.mov
/home/wtrdk/Foto/IMG_3128.MOV
/home/wtrdk/Foto/IMG_3155.MOV
/home/wtrdk/Foto/2013-09-21 13.44.12.mp4
/home/wtrdk/Foto/20111026_124246.mp4
/home/wtrdk/Foto/2013-09-20 11.24.23.mov
/home/wtrdk/Foto/IMG_3094.MOV
/home/wtrdk/Foto/IMG_3127.MOV
/home/wtrdk/Foto/IMG_3074.mov
/home/wtrdk/Foto/IMG_3153.MOV
/home/wtrdk/Foto/IMG_3152.MOV
/home/wtrdk/Foto/IMG_3126.MOV
/home/wtrdk/Foto/2013-09-09 18.43.53.mov
/home/wtrdk/Foto/IMG_3154.MOV
/home/wtrdk/Foto/2013-09-19 21.54.11.mp4
/home/wtrdk/Foto/2013-06-12 14.41.33.mov


Met -exec mv {} /home/wtrdk/Video \; :
wtrdk@www:~/Foto$ video
24641606 1332 -rw-rw-r--   1 wtrdk    wtrdk     1360647 Sep 24 15:52 /home/wtrdk/Foto/2013-09-21\ 13.44.12.mp4
24641600 30660 -rw-r--r--   1 wtrdk    wtrdk    31395710 Sep 24 15:52 /home/wtrdk/Foto/20111026_124246.mp4
24641604  612 -rw-rw-r--   1 wtrdk    wtrdk      622975 Sep 24 15:52 /home/wtrdk/Foto/2013-09-19\ 21.54.11.mp4


Vreemde output, de eerste 3 bestanden met uitgebreide info, de rest simpel weergegeven. Alleen de eerste 3 worden dus verplaatst!

[ Voor 94% gewijzigd door Wtrdk op 25-09-2013 12:34 ]


  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 23:11
code:
1
ls /home/homedir/Foto/{*.avi,*.mov,*.mp4,*.mkv,*.m4v} 2>/dev/null | xargs -Ifile mv file /home/homedir/Video/

Sinds de 2 dagen regel reageer ik hier niet meer


  • Cidolfas
  • Registratie: September 2007
  • Laatst online: 16:30
Probeer dit eens als je find wil gebruiken. De oplossing hierboven kan ook prima natuurlijk, je hebt zat oplossingen :).

code:
1
find /home/homedir/Foto \( -iname "*.mov" -o -iname "*.mp4" \) -exec ls -l {} \;


Volgens mij pakt find de output van of de eerste EXPR of de tweede EXPR. Je krijgt ze dus niet allebei. Zo maak je er 1 EXPR van.

Als je hier wel alle bestanden uit krijgt kan je natuurlijk de "ls -l" vervangen door het move commando etc.... :) .


De user hier onder heeft inderdaad een betere uitleg :*)

[ Voor 36% gewijzigd door Cidolfas op 25-09-2013 12:41 ]

i5-10600K | MSI MAG Tomahawk Z490 | Asus DUAL GeForce RTX 3070 OC | Corsair Vengeance 32 GB 3600 Mhz | Noctua NH-D15 Chromax.Black | Corsair RM850x | Fractal Design Meshify S2


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 10:44

Kees

Serveradmin / BOFH / DoC
Foeijonghaai schreef op woensdag 25 september 2013 @ 12:25:
[...]

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ touch 1.dit
$ touch 2.dit
$ touch 3.dit
$ touch 3.dat
$ touch 2.dat
$ touch 1.dat
$ ls
1.dat  1.dit  2.dat  2.dit  3.dat  3.dit
$ find . -name "*.dat" -print
./2.dat
./1.dat
./3.dat
$ find . -name "*.dat" -o -name "*.dit" -print
./3.dit
./1.dit
./2.dit
$ find . -name "*.dit" -o -name "*.dat" -print
./2.dat
./1.dat
./3.dat

Hmm, reproduceerbaar.
Uiteraard reproduceerbaar want je mist een actie na je eerste match. Probeer dit maar eens:

find . -name "*.dat" -print -o -name "*.dit" -print
of
find . \( -name "*.dat" -o -name "*.dit" \) -print

Jouw find word geinteprteerd als: find . (-name "*.dit") -o (-name "*.dat" -print)

edit: wat CurlyMo dus zegt

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • technorabilia
  • Registratie: November 2006
  • Laatst online: 11:07
find fotodir -name *.mov -o -name *.mp4 | xargs -i mv {} videodir

👉🏻 Blog 👈🏻


  • Foeijonghaai
  • Registratie: Juli 2001
  • Laatst online: 24-09 14:52
Kees schreef op woensdag 25 september 2013 @ 12:38:
[...]
Uiteraard reproduceerbaar want je mist een actie na je eerste match. Probeer dit maar eens:

find . -name "*.dat" -print -o -name "*.dit" -print
of
find . \( -name "*.dat" -o -name "*.dit" \) -print

Jouw find word geinteprteerd als: find . (-name "*.dit") -o (-name "*.dat" -print)

edit: wat CurlyMo dus zegt
Dat blijkt idd uit de debug informatie. Zie ook mijn wijziging van die posting.

Ik ging er altijd (onterecht) vanuit dat de actie sloeg op het totale zoekresultaat.

  • Wtrdk
  • Registratie: Mei 2006
  • Laatst online: 03-09 11:39
Allen bedankt! Ik ben er uit!
Dit is 'm geworden, en hij werkt prima:
code:
1
find /home/wtrdk/Foto \( -iname "*.mov" -o -iname "*.mp4" -o -iname "*.avi" -o -iname "*.mkv" -o -iname "*.m4v" \) -exec mv {} /home/wtrdk/Video \;
Pagina: 1