Suchen Sie in einem Verzeichnis nach Dateien mit gepaarten Namen

Suchen Sie in einem Verzeichnis nach Dateien mit gepaarten Namen

Ich führe Tests eines Testsatzes mit variabler Größe und Inhalt durch. Datendateien werden häufig hinzugefügt und entfernt. Ich suche nach einer automatisierten Möglichkeit zum Erstellen einer Dateiliste.

Alle Dateien befinden sich in Unterverzeichnissen von D; ich brauche das vollständige Verzeichnis und den Namen, der zu einer Textdatei hinzugefügt wird. Ich brauche jedoch nur die Dateien, die eine „gepaarte“ Datei haben, die denselben Dateinamen, aber eine andere Erweiterung hat (also ... einen anderen Dateinamen, aber auf strukturierte Weise). Wenn also ein MyFileName.Aund vorhanden ist MyFileName.B, möchte ich D/.../MyFileNamees zur Dateiliste hinzufügen.

Es gibt .ADateien ohne .BDateien, aber keine .BDateien ohne .ADateien. Wenn a .Aeine Datei hat .B, dann liegen beide Dateien im selben Verzeichnis.

Irgendein Rat?

Antwort1

Wenn keiner der Dateinamen Zeilenumbrüche enthält, können Sie Folgendes tun:

find D -type f \( -name '*.A' -o -name '*.B' \) |
  sed 's/\.[^.]*$//' |
  sort |
  uniq -d >paired_files

Dies sollte im allgemeineren Fall funktionieren, in dem .BDateien ohne .ADateien vorhanden sind.

So verarbeiten Sie beliebige Dateinamen mit aktuellen GNU-Tools:

find D -type f \( -name '*.A' -o -name '*.B' \) -print0 |
  sed -z 's/\.[^.]*$//' |
  sort -z |
  uniq -dz |
  tr '\0' '\n' >paired_files

Antwort2

Wenn Ihre Aussage „Es gibt keine .B-Dateien ohne .A-Dateien“ zutrifft, holen Sie sich eine Liste der .B-Dateien und entfernen Sie die Erweiterung.

find $directory-to-search -name "*.B" | sed -r -e "s~(.*)\.B~\1~g"

Antwort3

Mit zsh:

print -rl mydir/**/*.A(.e_'REPLY=$REPLY:r; [[ -f $REPLY.B ]]'_)

:rentfernt die Erweiterung, wenn also der Inhalt von $REPLYwar, wird er mydir/somedir/somefile.Anach dem Ausführen zu ; der Rest ist ähnlich wieREPLY=$REPLY:rmydir/somedir/somefile
diese Antwort.

verwandte Informationen