Kopera vissa filer från flera olika kataloger
Kopera vissa filer från flera olika kataloger
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.
Re: Kopera vissa filer från flera olika kataloger
Svar ja. Det borde fungera med det här i Terminalen: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)
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
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
Senast redigerad av 8 ubot, redigerad totalt 12 gång.
Re: Kopera vissa filer från flera olika kataloger
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?
ǁ Q: Why is top posting so bad?
Re: Kopera vissa filer från flera olika kataloger
Synpunkt 1: Wow, tack!
Jag återkommer med feedback när jag hunnit testa.
Jag återkommer med feedback när jag hunnit testa.
Re: Kopera vissa filer från flera olika kataloger
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 skrev:Synpunkt 1: Wow, tack!
Jag återkommer med feedback när jag hunnit testa.
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'
:/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'
Re: Kopera vissa filer från flera olika kataloger
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/.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'
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.
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
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:
Därmed inte sagt att min variant nödvändigtvis är vare sig bättre eller sämre.
Kod: Markera allt
find /sökväg/till/en/katalog -iregex '.*\.\(avi\|mpg\|mov\)' -exec cp -t /sökväg/till/en/ny/katalog {} +
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.

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.
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).
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:
Därmed inte sagt att min variant nödvändigtvis är vare sig bättre eller sämre.Kod: Markera allt
find /sökväg/till/en/katalog -iregex '.*\.\(avi\|mpg\|mov\)' -exec cp -t /sökväg/till/en/ny/katalog {} +
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?
med olika kameror genom åren, kan man istället söka efter alla filer som
*inte* innehåller *.jpg eller *.JPG?
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: Markera allt
find /sökväg/till/en/katalog -iregex '.*\.*$' | grep -iv "\.jpg$"
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Kopera vissa filer från flera olika kataloger
Använd utropstecken för att negera så här:IXPNU skrev:kan man istället söka efter alla filer som
*inte* innehåller *.jpg eller *.JPG?
Kod: Markera allt
find ! -iregex '.*\.jpg'
Att matcha mot mimetype är betydligt bättre även om det i många fall kanske är lite väl pretentiös.