Ubuntu Sverige
https://ubuntu-se.org/phpBB3/

Kopera vissa filer från flera olika kataloger
https://ubuntu-se.org/phpBB3/viewtopic.php?f=220&t=52045
Sida 1 av 1

Författare:  IXPNU [ 12 dec 2010, 13:11 ]
Inläggsrubrik:  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)

Författare:  ubot [ 12 dec 2010, 13:36 ]
Inläggsrubrik:  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!

Författare:  dmz [ 12 dec 2010, 14:04 ]
Inläggsrubrik:  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 \;

Författare:  IXPNU [ 12 dec 2010, 15:02 ]
Inläggsrubrik:  Re: Kopera vissa filer från flera olika kataloger

Synpunkt 1: Wow, tack!

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

Författare:  ubot [ 12 dec 2010, 15:05 ]
Inläggsrubrik:  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.

Författare:  IXPNU [ 12 dec 2010, 15:10 ]
Inläggsrubrik:  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'

Författare:  ubot [ 12 dec 2010, 15:12 ]
Inläggsrubrik:  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.

Författare:  Konservburk [ 12 dec 2010, 15:15 ]
Inläggsrubrik:  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.

Författare:  ubot [ 12 dec 2010, 15:19 ]
Inläggsrubrik:  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.

Författare:  IXPNU [ 17 dec 2010, 13:30 ]
Inläggsrubrik:  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.

Författare:  IXPNU [ 17 dec 2010, 14:37 ]
Inläggsrubrik:  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?

Författare:  ubot [ 17 dec 2010, 14:42 ]
Inläggsrubrik:  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!

Författare:  Konservburk [ 17 dec 2010, 15:03 ]
Inläggsrubrik:  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.

Sida 1 av 1 Alla tidsangivelser är UTC + 1 timme [ Sommartid ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/