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.A
und vorhanden ist MyFileName.B
, möchte ich D/.../MyFileName
es zur Dateiliste hinzufügen.
Es gibt .A
Dateien ohne .B
Dateien, aber keine .B
Dateien ohne .A
Dateien. Wenn a .A
eine 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 .B
Dateien ohne .A
Dateien 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 ]]'_)
:r
entfernt die Erweiterung, wenn also der Inhalt von $REPLY
war, wird er mydir/somedir/somefile.A
nach dem Ausführen zu ; der Rest ist ähnlich wieREPLY=$REPLY:r
mydir/somedir/somefile
diese Antwort.