Kopera vissa filer från flera olika kataloger

Hjälp med installation och användning av program
IXPNU
Inlägg: 143
Blev medlem: 11 feb 2008, 20:06
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Kopera vissa filer från flera olika kataloger

Inlägg av IXPNU »

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 3 IXPNU, redigerad totalt 19 gång.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av ubot »

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: Markera allt

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: Markera allt

#!/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 8 ubot, redigerad totalt 12 gång.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Kopera vissa filer från flera olika kataloger

Inlägg av dmz »

Kod: Markera allt

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?
IXPNU
Inlägg: 143
Blev medlem: 11 feb 2008, 20:06
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av IXPNU »

Synpunkt 1: Wow, tack!

Jag återkommer med feedback när jag hunnit testa.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av ubot »

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.
IXPNU
Inlägg: 143
Blev medlem: 11 feb 2008, 20:06
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av IXPNU »

...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'
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av ubot »

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 1 ubot, redigerad totalt 12 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kopera vissa filer från flera olika kataloger

Inlägg av Konservburk »

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: Markera allt

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.
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av ubot »

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.
IXPNU
Inlägg: 143
Blev medlem: 11 feb 2008, 20:06
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av IXPNU »

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: Markera allt

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.
IXPNU
Inlägg: 143
Blev medlem: 11 feb 2008, 20:06
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av IXPNU »

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?
ubot
Inlägg: 4613
Blev medlem: 04 jan 2008, 14:03
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS

Re: Kopera vissa filer från flera olika kataloger

Inlägg av ubot »

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: Markera allt

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!
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Kopera vissa filer från flera olika kataloger

Inlägg av Konservburk »

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: Markera allt

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.
Skriv svar

Återgå till "Program"