Finden Sie Dateien mit einem ähnlichen Namen für den Ordner

962
Dan G

Ich bin auf OS X und habe einen Ordner, der eine Reihe von Unterordnern enthält. Ich möchte zwei Dinge tun. Die erste ist, um sicherzustellen, dass jeder Unterordner eine Datei in der Form [Name des Unterordners] .grade.xml enthält. Dann muss ich in der entsprechenden Datei suchen und ersetzen, um ein paar Änderungen vorzunehmen.

Für den zweiten Teil weiß ich, wie man sed für eine einzelne Datei verwendet, um das zu tun, was ich tun muss, aber ich habe das Problem, zu überprüfen, ob die Datei vorhanden ist, und dann den Befehl darauf auszuführen. Irgendwelche Tipps dazu wären willkommen.

Hinweis: Ich brauche nicht unbedingt eine vollständige Antwort, zumal ich hier etwas lernen möchte. Ein Zeiger in die richtige Richtung wäre aber schön.

(Mir ist klar, dass es vielleicht bessere Wege als die Befehlszeile gibt, um dies zu erreichen, aber ich habe in Zukunft auf anderen Unix-basierten Systemen ähnliche Dinge tun müssen und werde dies auch tun müssen, also würde ich es lieber wissen :)

1
Ich könnte Ihnen eine bessere Antwort geben, wenn Sie Ihre Frage klarer formulieren :-) ℝaphink vor 14 Jahren 0
Mir wurde klar, dass ich den Namen der XML-Datei so formatiert hatte, dass die Hälfte davon nicht angezeigt wurde. Das tut mir leid! :) Dan G vor 14 Jahren 0

2 Antworten auf die Frage

1
James Polley
#!/bin/bash  # Get directory name from argument, default is .  DIR=$  # For each subfolder in DIR (maxdepth limits to one level in depth) find "$" -maxdepth 1 -type d | while read dir; do # Check that there is a file called $dir.grade.xml in this dir dirname=$(basename "$") gradefile="$"/"$".grade.xml if [ -e "$" ]; then sed -i .bak "s/foo/bar/g" "$" else echo "Warning: $ does not contain $" fi done 

Kleine Änderungen am Raphink-Rahmen.

Schlüsselpunkte:

  • Überprüfen Sie direkt das Vorhandensein von Dateien, [ -e filename ]anstatt ls auszuführen
  • Geben Sie alle Variablen ein $. oft nicht unbedingt notwendig, vermeidet aber Mehrdeutigkeit ( $und $nameist eindeutig verschieden, $variablenamekönnte auch bedeuten)
  • Übergeben Sie eine Erweiterung an sed, um Sicherungsdateien zu erstellen. Dies ist sowohl eine bewährte Methode (für den Fall, dass Ihr Munging schief geht) als auch unter OSX obligatorisch (die Version von raphink interpretiert s/foo/bar/gdie von Ihnen gewünschte Erweiterung für die Sicherungsdateien) und versucht dann, den Dateinamen als Befehl zu analysieren.
  • Okay, ich habe gelogen, es ist eigentlich nicht zwingend erforderlich - Sie könnten sed -i "" "s/foo/bar/g" $eine leere Erweiterung übergeben, die dazu führen würde, dass sed keine Sicherung macht.
Es ist immer eine gute Idee, Variablen mit Dateinamen anzugeben. Es ist besser, Backticks zu vermeiden und stattdessen `$ ()` zu verwenden. Dennis Williamson vor 14 Jahren 0
Bearbeitet, um $ () anstelle von `` zu verwenden und Variablen zu verwenden, die Dateinamen enthalten, da Dennis korrekt ist. James Polley vor 14 Jahren 0
0
ℝaphink

OK, Sie müssen dafür ein Skript erstellen. Ich werde Bash dafür auswählen.

#!/bin/bash  # Get directory name from argument, default is . DIR=$  # For each subfolder in DIR (maxdepth limits to one level in depth) find $DIR -maxdepth 1 -type d | while read dir; do # Check that there is a file called *.xml in this dir if ls $dir/*.xml &>/dev/null; then # Loop through xml files found in $dir # or do you actually need to check that there is only ONE file? for xmlfile in $dir/*xml; do # Do whatever treatment with sed you wish to do sed -i 's/foo/bar/g' $xmlfile done else echo "Warning: $dir does not have a *xml file in it" fi done 

Speichern Sie diese Datei als .sh-Skript und führen Sie sie aus

$ chown +x yourscript.sh $ ./yourscript.sh /path/to/dir # Path is optional, defaults to .