Dans ce script, je suppose, vous obtenez votre carte d'identité d'un fichier (Je l'ai appelé ici someidcontent.txt
). Ensuite, vous pouvez écrire un script comme celui-ci (en supposant que vous travaillez uniquement sur Linux).
getID = $(shell cat someidcontent.txt)
all:
if [ "$(getID)" == "1234567890" ]; then \
cp -v output.txt ./delivery/$(getID).txt; \
fi
.PHONY: all
Modifier
je fait une erreur dans mon script précédent. Je n'ai pas vérifié, si l'identifiant est correct. Maintenant, mon nouveau script fait ceci: je lis dans un fichier l'identifiant et je vérifie s'il est correct. Si l'ID est correct, alors un fichier sera copié dans le répertoire cible avec le numéro d'identification.
# get ID from a file
getID := $(shell cat someidcontent.txt)
# need a hack for successful checking
idToCheck := $(getID)
# check procedure
checkID := $(shell echo $(idToCheck) | grep "[A-Z][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]$$")
all:
ifeq "$(checkID)" "$(idToCheck)"
echo found
cp -v output.txt ./delivery/$(idToCheck).txt;
endif
.PHONY: all
Edit 2
Ok, cela était un peu difficile, mais je l'ai résolu en quelque sorte. Peut-être y a-t-il aussi d'autres moyens de résoudre cela mieux. Dans ma solution, je suppose que le fichier avec les ID et les noms de fichiers sources ressembler à ceci (en d'autres termes, c'est le contenu de mon someidcontent.txt
):
A2345-678:output1.txt
B3456-123:output.txt
C0987-987:thirdfile.txt
Et voici mon makefile avec des commentaires pour des explications supplémentaires. Je l'espère, ils sont suffisants
# retrieve id and filename data from other file
listContent := $(shell cat someidcontent.txt)
# extract only IDs from other files
checkIDs = $(shell echo $(listContent) | grep -o "[A-Z][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]")
all:
# iterate only over IDs
# first, give me the ID
# second retrieve the filename part for successful copy procedure
# and copy the file to the target dir with ID as filename
@$(foreach x,$(checkIDs), \
echo $(x); \
cp -v $(shell echo $(listContent) | grep -o "$(x):[A-Z0-9a-z\.]*" | sed "s/[-A-Z0-9]*://g") ./delivery/$(x).t$
)
.PHONY: all
Comment on faire, dépend quelques autres facteurs. Les fichiers sont-ils eux-mêmes ciblés, ou sont-ils simplement générés, alors qu'une cible différente est construite en tant que sous-produit? Si les fichiers sont eux-mêmes des cibles, je suppose que votre makefile est lui-même généré, comment faites-vous cela? Veuillez lire [mcve] (https://stackoverflow.com/help/mcve). – Krom
Je recommande de déléguer le test de nom à un script. Quels langages de script êtes-vous à l'aise avec? – Beta
@Beta: Je suis à l'aise avec python – Vicky