ich ein Problem mit dem folgenden Shell-Skript bin vor:Shell-Skript: Finden Sie nicht mit Ordnern in Anführungszeichen umgehen
#!/bin/bash
searchPattern=".*\/.*\.abc|.*\/.*\.xyz|.*\/.*\.[0-9]{3}"
subFolders=$(find -E * -type d -regex ".*201[0-4][0-1][0-9].*|.*20150[1-6].*" -maxdepth 0 | sed 's/.*/"&"/')
echo "subFolders: $subFolders"
# iterate through subfolders
for thisFolder in $subFolders
do
echo "The current subfolder is: $thisFolder"
find -E $thisFolder -type f -iregex $searchPattern -maxdepth 1 -print0 | xargs -0 7z a -mx=9 -uz1 -x!.DS_Store ${thisFolder}/${thisFolder}_data.7z
done
Die Idee dahinter ist, Dateitypen mit der Endung .abc, .xyz zu archivieren und zu. 000-.999 in einem 7z-Archiv pro Unterordner. Ich kann jedoch nicht mit Ordnern einschließlich Leerzeichen umgehen. Als ich das Skript ausführen, wie oben gezeigt ich folgende Fehlermeldung immer erhalten:
find: "20130117_test": No such file or directory
Wenn ich das Skript mit der Linie
subFolders=$(find -E * -type d -regex ".*201[0-4][0-1][0-9].*|.*20150[1-6].*" -maxdepth 0 | sed 's/.*/"&"/')
geändert
subFolders=$(find -E * -type d -regex ".*201[0-4][0-1][0-9].*|.*20150[1-6].*" -maxdepth 0)
das Skript arbeitet laufen wie Charme, aber natürlich nicht für Ordner mit Platz.
Merkwürdigerweise, wenn ich die folgende Zeile direkt in der Schale ausführen, funktioniert es wie erwartet:
find -E "20130117_test" -type f -iregex ".*\/.*\.abc|.*\/.*\.xyz|.*\/.*\.[0-9]{3}" -maxdepth 1 -print0 | xargs -0 7z a -mx=9 -uz1 -x!.DS_Store "20130117_test"/"20130117_test"_data.7z
Ich weiß, das Problem irgendwie zum Speichern einer Liste von Ordnern (in Anführungszeichen) in der Beziehung steht SubFolders-Variable, aber ich finde einfach keinen Weg, um es richtig funktionieren zu lassen.
Ich hoffe, jemand weiter fortgeschritten in der Schale hier kann mir helfen.
Der normale Weg zur Schleife am Ausgang (GNU) 'find' ist:' während IFS = -r -d 'gelesen ' Dateiname; mach etwas mit "$ filename" ...; done <<(find .... -print0) '. Siehe [ParsingLs] (http://mywiki.wooledge.org/ParsingLs) (Ich denke, es ist eine gute Idee, wenn Sie diese Seite lesen, und vielleicht lesen Sie alle Informationen auf dieser Seite!). –
@gniourf_gniourf danke für den Hinweis! Es hat mich ganz etwas studieren, aber ich schaffte es zum Laufen zu bringen – zionlion
Wörtliche Zitate (Quotes in den Daten Skript Prozesse) (meine Antwort siehe unten) kann für syntaktische Anführungszeichen (Anführungszeichen im Skript selbst) nicht ersetzen. Siehe [BashFAQ # 50] (http://mywiki.wooledge.org/BashFAQ/050). –