Visa obesvarade inlägg | Visa aktiva trådar Aktuellt datum och tid: 22 okt 2019, 13:00



Svara på tråd  [ 13 inlägg ] 
 Kopera vissa filer från flera olika kataloger 
Författare Meddelande

Blev medlem: 11 feb 2008, 20:06
Inlägg: 143
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Svara med citat
 Kopera vissa filer från flera olika kataloger  Tråden är löst
Finns det ett sätt att kopiera alla filer som matchar ett vist mönster (*.avi *.AVI *.mpg *.MPG *.mov *.MOV) från en katalog *och dess underkataloger*, till en målkatalog? Helst utan att behålla originalkatalogstrukturen (dvs från t.ex. foton/semesterbilder2003-08/underkatalog223/film001.avi till målkatalog/film001.avi)


Senast redigerad av IXPNU 19 dec 2010, 09:13, redigerad totalt 3 gånger.



12 dec 2010, 13:11
Profil

Blev medlem: 04 jan 2008, 14:03
Inlägg: 4613
OS: Ubuntu
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
IXPNU skrev:
Finns det ett sätt att kopiera alla filer som matchar ett vist mönster (*.avi *.AVI *.mpg *.MPG *.mov *.MOV) från en katalog *och dess underkataloger*, till en målkatalog? Helst utan att behålla originalkatalogstrukturen (dvs från t.ex. foton/semesterbilder2003-08/underkatalog223/film001.avi till målkatalog/film001.avi)


Svar ja. Det borde fungera med det här i Terminalen:
Kod:
extension_array=( avi AVI mpg MPG mov MOV ); for i in ${extension_array[@]}; do for file in /path/to/files/*.$i; do cp $file /new/path/to/files/; echo "$file copied."; done; done


Du kan alltid testa raden genom att göra så här:

1. Skapa en katalog i din Hemkatalog som heter test_old: mkdir test_old
2. Skapa en katalog i din Hemkatalog som heter test_new: mkdir test_new
3. Skapa några filer i test_old: touch test_old/file1.mov touch test_old/file2.mpg touch test_old/file3.AVI
4. Byt ut /path/to/files*.$i mot $HOME/test_old/*.$i och /new/path/to/files/ mot $HOME/test_new/ i min rad.
5. Kopiera och klistra in raden jag skrev (efter att du har gjort ändringarna i punkt 4) i Terminalen och tryck Enter.
6. Kontrollera att filerna finns i $HOME/test_new/ med kommandot: ls -l $HOME/test_new

Om du ska använda det här ofta så är det nog smartast att skriva om det till ett skript. Säg till så gör jag det.

Edit:

Jag har gjort det nu. :)

Här är ett bash-skript som flyttar eller kopierar massa filer från en katalog till en annan beroende på filernas filändelser:

Kod:
#!/bin/bash

# Kör skriptet så här: ./skript.sh "cp" "$HOME/oldfiles/" "$HOME/newfiles/" "mov wav mp3" eller så här: ./skript.sh "mv" "$HOME/oldfiles/" "$HOME/newfiles/" "mov wav mp3"

# Flytta eller kopiera filerna?
if [[ "$1" != "cp" || "$1" != "mv" ]]; then
echo "Felmeddelande: Vill du flytta eller kopiera filerna? Starta skriptet med kommandot: ./skript.sh \"cp\" \"/väg/till/gamla/filer/\" \"väg/till/nya/filer/\""
exit
fi

if [[ -z "$4" ]]; then
echo "Du måste ange en lista med filändelser. Kör skriptet så här: ./skript.sh \"cp\" \"/väg/till/gamla/filer/\" \"väg/till/nya/filer/\" \"mov wav mp3\" där mov, wav, mp3 är en lista med filändelser."
exit
else
extensions=$4
fi

# Finns katalogerna i systemet?
dir1=$(find $HOME | grep -o "^$2" | sed 's/\/$//')
dir2=$(find $HOME | grep -o "^$3" | sed 's/\/$//')
if [[ -z "$dir1" || -z "$dir2" ]]; then
echo "Skriptet hittar inte katalogerna. Kör skriptet så här: ./skript.sh \"cp\" \"/väg/till/gamla/filer/\" \"väg/till/nya/filer/\""
exit
fi

# Vilka filändelser har filerna som du kopiera/flytta?
extension_array=( $extensions )

# Kopiera eller flytta varje fil i katalogen $dir1 som har rätt filändelse till katalogen $dir2.
for i in ${extension_array[@]}; do
for file in $dir1/*.$i; do
filename=$(echo "$file" | sed 's/^.*\///')
exist=$(find $dir2 -name '$filename')
if [[ -z "$exist" ]]; then
$1 $file $dir2/
echo "$file kopierad/flyttad till katalogen $dir2."
else
echo "En fil med namnet $filename existerar i katalogen $dir2. Filen kopierades INTE från $dir1 till $dir2."
fi
done
done


Kom gärna med synpunkter på skriptet!


Senast redigerad av ubot 12 dec 2010, 15:33, redigerad totalt 8 gånger.



12 dec 2010, 13:36
Profil
Användarvisningsbild

Blev medlem: 29 jul 2008, 19:42
Inlägg: 3292
OS: Arch Linux
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
Kod:
find where_from -regextype awk -regex '.+\.(avi|AVI|mpg|MPG|mov|MOV)$' -execdir cp {} target \;

_________________
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?


12 dec 2010, 14:04
Profil

Blev medlem: 11 feb 2008, 20:06
Inlägg: 143
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
Synpunkt 1: Wow, tack!

Jag återkommer med feedback när jag hunnit testa.


12 dec 2010, 15:02
Profil

Blev medlem: 04 jan 2008, 14:03
Inlägg: 4613
OS: Ubuntu
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
IXPNU skrev:
Synpunkt 1: Wow, tack!

Jag återkommer med feedback när jag hunnit testa.


Gör så. Vi får se hur det fungerar. Min rad har jag testat men skriptet har jag inte hunnit testa ännu. Det borde fungera men det kanske är något som måste finjusteras.


12 dec 2010, 15:05
Profil

Blev medlem: 11 feb 2008, 20:06
Inlägg: 143
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
...något verkar lite knasigt. Se:

:/media/FILMOSV$ ~/skript.sh "cp" "/_FOTO_osorterade och filmer/" "kamerafilmer-alla" "mov mpg avi"
: rad 6: syntaxfel i villkorligt uttryck: oväntad symbol ";"
: rad 6: syntaxfel nära ";"
: `if [[ "$1" != "cp" || "$1" != "mv"]]; then'


12 dec 2010, 15:10
Profil

Blev medlem: 04 jan 2008, 14:03
Inlägg: 4613
OS: Ubuntu
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
IXPNU skrev:
...något verkar lite knasigt. Se:

:/media/FILMOSV$ ~/skript.sh "cp" "/_FOTO_osorterade och filmer/" "kamerafilmer-alla" "mov mpg avi"
: rad 6: syntaxfel i villkorligt uttryck: oväntad symbol ";"
: rad 6: syntaxfel nära ";"
: `if [[ "$1" != "cp" || "$1" != "mv"]]; then'


Jag ska kolla på det. Dessutom måste du ange hela sökvägen till katalogerna, typ /home/username/_FOTO_osorterade och filmer/ inte bara /_FOTO_osorterade och filmer/.

Edit:

Testa att ändra if [[ "$1" != "cp" || "$1" != "mv"]]; then till if [[ "$1" != "cp" || "$1" != "mv" ]]; then
Jag glömde nog ett mellanrum mellan "mv" och ]].
Tänk också på att skriptet (precis som Linux) gör skillnad på avi och AVI. Om du vill att skriptet ska kopiera/flytta filer oavsett om filändelsen består av stora eller små bokstäver så ta med även den andra varianten, typ: "mov MOV avi AVI mpg MPG" osv.


Senast redigerad av ubot 12 dec 2010, 15:17, redigerad totalt 1 gång.



12 dec 2010, 15:12
Profil
Användarvisningsbild

Blev medlem: 07 apr 2007, 22:28
Inlägg: 5919
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
Det du bör se upp med när du kopierar från flera kataloger till en enda katalog är att det kan finnas filer med exakt samma namn. Själv skulle jag gjort ungefär som dmz:

Kod:
find /sökväg/till/en/katalog -iregex '.*\.\(avi\|mpg\|mov\)' -exec cp -t /sökväg/till/en/ny/katalog {} +

Därmed inte sagt att min variant nödvändigtvis är vare sig bättre eller sämre.


12 dec 2010, 15:15
Profil

Blev medlem: 04 jan 2008, 14:03
Inlägg: 4613
OS: Ubuntu
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
Sant, mitt skript struntar fullständigt i om det finns en fil med samma namn i den nya katalogen! Jag får nog lägga in en kontrollfunktion för det också för det är ju komplett livsfarligt! :|

Edit:

Jag uppdaterade mitt skript. Jag rekommenderar att du kopierar och klistrar in mitt uppdaterade skript istället för att använda det gamla. Det är också mycket möjligt att dmz's eller Konservburks kommando är mycket smidigare att använda! Men mitt skript ska hoppa över filen om det redan finns en fil med samma namn i den nya katalogen. Vad du än gör så testa först mitt skript utan att köra det på dina riktiga filer! Skapa någon katalog och lite underkataloger, skapa några filer i olika kataloger och skapa några filer med samma namn i olika kataloger. Testa innan du kör i skarpt läge!

Dessutom missar mitt skript underkataloger som det är idag. Man måste bygga in en funktion för att ta med filer som ligger i underkataloger också. Som det är nu får man köra skriptet på varje katalog som man vill kopiera filer ur och det är ju för omständigt.


12 dec 2010, 15:19
Profil

Blev medlem: 11 feb 2008, 20:06
Inlägg: 143
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
Tack *alla* för hjälpen!
Såvit jag kunnat bedöma gjorde Konservburks förslag precis det jag behövde. Så funkade det för mig:

- även filer i underkataloger kopieras
- om det finns en namnkollision skrivs inte den första filen över (dvs nästa fil med samma namn kopieras inte)
- både filer med versaler och gemener i filändelsen (.avi, .AVI) kopieras
- absolut sökäg ska anges (/home/anvnamn/Foton/ osv).

Konservburk skrev:
Det du bör se upp med när du kopierar från flera kataloger till en enda katalog är att det kan finnas filer med exakt samma namn. Själv skulle jag gjort ungefär som dmz:

Kod:
find /sökväg/till/en/katalog -iregex '.*\.\(avi\|mpg\|mov\)' -exec cp -t /sökväg/till/en/ny/katalog {} +

Därmed inte sagt att min variant nödvändigtvis är vare sig bättre eller sämre.


17 dec 2010, 13:30
Profil

Blev medlem: 11 feb 2008, 20:06
Inlägg: 143
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
Förresten, för att vara säker på att få med sig alla filmsnuttar som tagits
med olika kameror genom åren, kan man istället söka efter alla filer som
*inte* innehåller *.jpg eller *.JPG?


17 dec 2010, 14:37
Profil

Blev medlem: 04 jan 2008, 14:03
Inlägg: 4613
OS: Ubuntu
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
IXPNU skrev:
Förresten, för att vara säker på att få med sig alla filmsnuttar som tagits
med olika kameror genom åren, kan man istället söka efter alla filer som
*inte* innehåller *.jpg eller *.JPG?

Kod:
find /sökväg/till/en/katalog -iregex '.*\.*$' | grep -iv "\.jpg$"


Jag tror det här duger. Du ska få alla filer i /sökväg/till/en/katalog som inte har filändelsen jpg eller JPG. Tänk på att du bara söker med den här raden, du kopierar ingenting så som den ser ut nu!


17 dec 2010, 14:42
Profil
Användarvisningsbild

Blev medlem: 07 apr 2007, 22:28
Inlägg: 5919
Svara med citat
Inlägg Re: Kopera vissa filer från flera olika kataloger
IXPNU skrev:
kan man istället söka efter alla filer som
*inte* innehåller *.jpg eller *.JPG?

Använd utropstecken för att negera så här:

Kod:
find ! -iregex '.*\.jpg'

Rent allmänt är det egentligen inte helt optimalt att söka efter filändelser eftersom de inte nödvändigtvis speglar sanningen. Det kan finnas filnamn som slutar på .jpg utan att filen är en jpeg-fil. Och det kan finnas jpeg-filer som har filnamn utan .jpg på slutet.

Att matcha mot mimetype är betydligt bättre även om det i många fall kanske är lite väl pretentiös.


17 dec 2010, 15:03
Profil
Visa inlägg nyare än:  Sortera efter  
Svara på tråd   [ 13 inlägg ] 

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
Main Engineer for phpBB3: Bertie at phpBB.com © 2000 - 2002, 2005 - 2007, the Group behind the Open Source code of phpBB.
Designed by STSoftware, modified by Katt, Konservburk & Peetra. Swedish translation by Peetra & phpBB Sweden © 2006-2011