Verwenden Sie xmlstarlet, um ein gesamtes Element zu entfernen, das einem Attributwert entspricht.
Meine Frage ähnelt sed - XML-Knoten löschen, der ein bestimmtes Element enthält - Unix & Linux Stack Exchange . Der Versuch, die dortigen Vorschläge umzusetzen, hat mich den ganzen Tag beschäftigt, aber ich habe es nicht geschafft, etwas zum Laufen zu bringen, deshalb stelle ich eine Frage.
Innerhalb eines Bash-Skripts muss ein ganzes <folder>
Element entfernt werden, wenn das id
Attribut einem bestimmten Wert entspricht. Ich benutze tatsächlich Benutzergruppen, um einen Teil davon zu machen. Angenommen, ein Benutzer ist nicht in der Gruppe folder_a
. dann sollte das gesamte <folder>
Element mit Attribut id=".Folder_A"
aus config.xml gelöscht werden. (Ich lösche auch den Ordner von der Festplatte.)
Mein Bash-Skript sieht folgendermaßen aus:
#!/bin/bash
grouplist=$(groups $theuser);
for foldername in '.Folder_A' '.Folder_B'; do
grpnm="${foldername,,}"|sed -e 's/^.//' if ! [[ $grouplist =~ ${grpnm} ]]; then perl -0777 -pe "s|(<folder.*?</folder>)|$1=~ /id=\"$foldername\"/?"":$1|gse" config.xml > config.xml
rm -fr "$foldername" else echo "permitting access to ${foldername}"
fi
done
Der Perl-Befehl funktioniert nicht . Es ist nur eine von vielen Varianten, die ich ausprobiert habe. Ich habe es auch mit sed versucht. Ich würde lieber xmlstarlet verwenden, aber ich hatte noch mehr Probleme damit.
Bearbeiten - Ich habe gerade diese Antwort gefunden:https://unix.stackexchange.com/a/339089/393289 Es hat mir dabei geholfen:
xml ed -d '//configuration/folder[contains(@id,".Folder_A")]' config.xml
Ich fühle mich jetzt näher. (Ich habe versucht, diese Antwort zu verbessern, aber ich habe noch nicht genug Wiederholungen.) Ich kann den Attributnamen jedoch aufgrund der Anführungszeichen oder etwas anderem noch nicht in eine Bash-Variable übersetzen.
Übrigens, wie kann ich dafür sorgen, dass eine direkte Bearbeitung (ähnlich dem sed -i
Befehl) durchgeführt wird, sobald ich sie zum Laufen gebracht habe?
Hier ist eine Beispieldatei config.xml:
<?xml version="1.0"?>
<configuration version="32">
<folder id=".Folder_A" label=".Folder_A" path="~/Sync/.Folder_A" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
<filesystemType>basic</filesystemType>
<device id="123ABC" introducedBy="">
<encryptionPassword/>
</device>
<device id="987ZYX" introducedBy="">
<encryptionPassword/>
</device>
<minDiskFree unit="">0</minDiskFree>
<versioning>
<cleanupIntervalS>0</cleanupIntervalS>
</versioning>
<copiers>0</copiers>
<disableSparseFiles>false</disableSparseFiles>
<disableTempIndexes>false</disableTempIndexes>
<paused>false</paused>
<weakHashThresholdPct>25</weakHashThresholdPct>
<markerName>.stfolder</markerName>
</folder>
<folder id=".Folder_B" label="Corporate (.Folder_B)" path="~/Sync/.Folder_B" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="5" ignorePerms="true" autoNormalize="false">
<filesystemType>basic</filesystemType>
<device id="123ABC" introducedBy="">
<encryptionPassword/>
</device>
<device id="987ZYX" introducedBy="">
<encryptionPassword/>
</device>
<minDiskFree unit="">0</minDiskFree>
<versioning>
<cleanupIntervalS>0</cleanupIntervalS>
</versioning>
<copiers>0</copiers>
<disableSparseFiles>false</disableSparseFiles>
<disableTempIndexes>false</disableTempIndexes>
<paused>false</paused>
<weakHashThresholdPct>25</weakHashThresholdPct>
<markerName>.stfolder</markerName>
</folder>
<device id="123ABC" name="laptop" compression="always" introducer="false" skipIntroductionRemovals="false" introducedBy="">
<paused>false</paused>
<autoAcceptFolders>true</autoAcceptFolders>
<maxSendKbps>0</maxSendKbps>
<maxRecvKbps>0</maxRecvKbps>
<maxRequestKiB>0</maxRequestKiB>
<untrusted>false</untrusted>
</device>
<device id="987ZYX" name="desktop" compression="always" introducer="false" skipIntroductionRemovals="false" introducedBy="">
<paused>false</paused>
<autoAcceptFolders>true</autoAcceptFolders>
<maxSendKbps>0</maxSendKbps>
<maxRecvKbps>0</maxRecvKbps>
<maxRequestKiB>0</maxRequestKiB>
<untrusted>false</untrusted>
</device>
<gui enabled="true" tls="true" debugging="false">
<address>127.0.0.1:8384</address>
<apikey>98qewr0qe9r</apikey>
<theme>default</theme>
</gui>
<ldap/>
<options>
<listenAddress></listenAddress>
<maxSendKbps>0</maxSendKbps>
<maxRecvKbps>0</maxRecvKbps>
<reconnectionIntervalS>60</reconnectionIntervalS>
<relaysEnabled>false</relaysEnabled>
<relayReconnectIntervalM>10</relayReconnectIntervalM>
<startBrowser>false</startBrowser>
<urAccepted>-1</urAccepted>
<urSeen>3</urSeen>
<urUniqueID/>
<urPostInsecurely>false</urPostInsecurely>
<urInitialDelayS>1800</urInitialDelayS>
<restartOnWakeup>true</restartOnWakeup>
<upgradeToPreReleases>false</upgradeToPreReleases>
<keepTemporariesH>24</keepTemporariesH>
<cacheIgnoredFiles>false</cacheIgnoredFiles>
<progressUpdateIntervalS>5</progressUpdateIntervalS>
<limitBandwidthInLan>false</limitBandwidthInLan>
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
<tempIndexMinBlocks>10</tempIndexMinBlocks>
<trafficClass>0</trafficClass>
<defaultFolderPath>~/Sync/</defaultFolderPath>
<maxFolderConcurrency>0</maxFolderConcurrency>
<crashReportingEnabled>false</crashReportingEnabled>
<databaseTuning>auto</databaseTuning>
<maxConcurrentIncomingRequestKiB>0</maxConcurrentIncomingRequestKiB>
<announceLANAddresses>false</announceLANAddresses>
<sendFullIndexOnUpgrade>false</sendFullIndexOnUpgrade>
</options>
</configuration>
Dies ist ein Beispiel für config.xml für die Synchronisierung.
Antworten
Verwenden Sie die Option -L
/ --inplace
(siehe xml edit --help
) und die genaue Übereinstimmung aus der verknüpften Antwort:
xml ed -L -d "//configuration/folder[@id=\"$foldername\"]" config.xml