[SOLVED]Symlink Exclude

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tilloo3
Beiträge: 43
Registriert: 04.05.2013 17:21:04

[SOLVED]Symlink Exclude

Beitrag von tilloo3 » 23.06.2015 11:31:40

Hallo Leute,

vorab hier schonmal das Script

Code: Alles auswählen

#! /bin/bash
target=/home/csgo/game/output
cs=/home/csgo/game/csgo-deagle1

exclude=( "*.conf" "*.cfg" "*txt" "*.ini" "*.smx" "*.mp3" "*.sh" )


for file in ${cs}; do
    for (( index = 0; index < ${#exclude[@]}; index++ )); do
        if [[ ${file} != ${exclude[${index}]} ]]; then
            ln -s ${file} ${target}
        elif [[ ${file} == ${exclude[${index}]} ]]; then
            cp ${file} ${target}
        fi  
    done
done
ich möchte mit diesem Script Symlinks von allen Dateien im Ordner erzeugen, ausser die Dateien die oben im Exlude stehen das heisst z.B bla.cfg soll nicht gesymlinked werden sondern einfach kopiert werden.
Das Problem ist jetzt aber das wenn ich das Script ausführe wird zwar ein Symlink vom Ordner gemacht aber alle Dateien dadrin werden einfach in das Output Verzeichnis kopiert.

Danke im Vorraus ! :=)
Zuletzt geändert von tilloo3 am 05.07.2015 21:25:25, insgesamt 2-mal geändert.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Symlink Exclude

Beitrag von linuxCowboy » 25.06.2015 18:31:44

zum Beispiel:

Code: Alles auswählen

#!/bin/bash

target=/home/csgo/game/output
cs=/home/csgo/game/csgo-deagle1

IFS=$'\n'

for f in `find $cs -type f`; do
	if [[
		$f == *.conf  || 
		$f == *.cfg   ||
		$f == *txt 	||
		$f == *.ini	||
		$f == *.smx	||
		$f == *.mp3	||
		$f == *.sh
	]]; then
		echo -n "copy: "; cp -v "$f" $target
	else
		echo -n "link: "; ln -sfv "$f" $target
	fi 
done | sort
Syntax: NoPaste-Eintrag38637
-der_linux_cowboy --- Besser werden! ... f*** w$$

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Symlink Exclude

Beitrag von rendegast » 25.06.2015 20:29:45

cs=/home/csgo/game/csgo-deagle1
...

for file in ${cs}; do
...
done
In der Art Enthält $file nur einmal den Wert /home/csgo/game/csgo-deagle1.
$file enthält so nie den Namen einer Datei IN /home/csgo/game/csgo-deagle1.
Die Tests schlagen fehl.

Eher

Code: Alles auswählen

...
for file in $(ls -1 ${cs}); do
...
Um besser gegen Leerzeichen gewappnet zu sein vielleicht

Code: Alles auswählen

...
ls -1 ${cs} | while read file; do
... echo "$file"
Gegen Dateinamen über eine Zeile dann vielleicht irgendwas mit 'find',
bei dem wiederum direkt ein exclude-Filter gesetzt werden kann, '! -name "*.txt"'.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

tilloo3
Beiträge: 43
Registriert: 04.05.2013 17:21:04

Re: Symlink Exclude

Beitrag von tilloo3 » 26.06.2015 07:53:35

Danke für eure Antworten !
#!/bin/bash

target=/home/csgo/game/output
cs=/home/csgo/game/csgo-deagle1

IFS=$'\n'

for f in `find $cs -type f`; do
if [[
$f == *.conf ||
$f == *.cfg ||
$f == *txt ||
$f == *.ini ||
$f == *.smx ||
$f == *.mp3 ||
$f == *.sh
]]; then
echo -n "copy: "; cp -v "$f" $target
else
echo -n "link: "; ln -sfv "$f" $target
fi
done | sort
Das hat mir echt weitergeholfen ! Jetzt werden zumindest alle Dateien (auch in den Subordnern) gesymlinked oder kopiert.
Jetzt habe ich nur noch ein Problem.
Gibt es einen Weg die Ordnerstruktur des Hauptordners beizubehalten ?
Momentan werden einfach alle Files zusammen in den Output Ordner geworfen.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Symlink Exclude

Beitrag von rendegast » 26.06.2015 15:30:58

Irgendwo habe ich mal ein Programm/Option gesehen, daß nur den Verzeichnisbaum kopiert.
rsync?



Alternativlösung:,
'lndir' aus Debianxutils-dev,
danach alle ungewünschten Links löschen, danach leere Verzeichnisse per 'rmdir -p'.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

tilloo3
Beiträge: 43
Registriert: 04.05.2013 17:21:04

Re: Symlink Exclude

Beitrag von tilloo3 » 26.06.2015 18:26:59

Irgendwo habe ich mal ein Programm/Option gesehen, daß nur den Verzeichnisbaum kopiert.
rsync?
Ja damit sollte es denke ich mal funktioneren aber es wäre "gut" wenn man das schon in das Beispiel von @linuxCowboy integrieren könnte.
Prinzipiell sollte das doch nicht so schwer sein oder ?

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Symlink Exclude

Beitrag von rendegast » 26.06.2015 20:22:21

rendegast hat geschrieben: Irgendwo habe ich mal ein Programm/Option gesehen, daß nur den Verzeichnisbaum kopiert.
rsync?
Ups, Sorry, direkt war das windows

Code: Alles auswählen

xcopy /t /e ....
Unter linux finde ich gerade nur Sachen mit einem Zwischenschritt, sowas wie

Code: Alles auswählen

lndir ...; find ... -type l -delete;
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

tilloo3
Beiträge: 43
Registriert: 04.05.2013 17:21:04

Re: Symlink Exclude

Beitrag von tilloo3 » 29.06.2015 20:31:13

Unter linux finde ich gerade nur Sachen mit einem Zwischenschritt, sowas wie
CODE: ALLES AUSWÄHLEN
lndir ...; find ... -type l -delete;
Puhh Okay ich habe mir das mal angeschaut aber da blicke ich echt nicht durch ....
Könnte denn kein Bash-Guru das mal schnell in das Script hier zaubern ? :P
Wäre euch echt dankbar bin langsam verzweifeln ^^

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Symlink Exclude

Beitrag von linuxCowboy » 02.07.2015 22:03:38

Simsalabim!

Code: Alles auswählen

#!/bin/bash

target=${1-/home/csgo/game/output}	# param 1
cs=${2-/home/csgo/game/csgo-deagle1}	# param 2

mkdir -p "$target"

[[ ! -d $cs || ! -d $target ]] && echo "not 2 dirs" && exit 1

find "$cs" -type f | 
	while read f; do
		filepath=$f
		[[ $filepath =~ ^\.*/(.*) ]] && filepath=${BASH_REMATCH[1]}

		if [[ $filepath =~ / ]]; then
			filepath=${filepath%/*}
		else
			filepath=
		fi

		mkdir -p "${target%/}/$filepath"

		if [[
			$f == *.conf  ||
			$f == *.cfg   ||
			$f == *txt    ||
			$f == *.ini   ||
			$f == *.smx   ||
			$f == *.mp3   ||
			$f == *.sh
		]]; then
			echo -n "copy: "
			cp -v "$f" "${target%/}/$filepath"
		else
			echo -n "link: "
			ln -sfv "$f" "${target%/}/$filepath"
		fi
	done | sort
Syntax: NoPaste-Eintrag38658
-der_linux_cowboy --- Besser werden! ... f*** w$$

tilloo3
Beiträge: 43
Registriert: 04.05.2013 17:21:04

[Erledigt] Symlink Exclude

Beitrag von tilloo3 » 05.07.2015 21:24:30

Simsalabim!
Vieeeellleeen Dank !! Tolle Zauberei *_*

Antworten